数据结构教程 第四课 算法效率的度量和存储空间需求

本课主题: 算法效率的度量和存储空间需求

教学目的: 掌握算法的渐近时间复杂度和空间复杂度的意义与作用

教学重点: 渐近时间复杂度的意义与作用及计算方法

教学难点: 渐近时间复杂度的意义

授课内容:

一、算法效率的度量

算法执行的时间是算法优劣和问题规模的函数。评价一个算法的优劣,可以在相同的规模下,考察算法执行时间的长短来进行判断。而一个程序的执行时间通常有两种方法:

1、事后统计的方法。

缺点:不利于较大范围内的算法比较。(异地,异时,异境)

2、事前分析估算的方法。

程序在计算机上运行所需时间的影响因素
算法本身选用的策略  
问题的规模 规模越大,消耗时间越多
书写程序的语言 语言越高级,消耗时间越多
编译产生的机器代码质量  
机器执行指令的速度  

综上所述,为便于比较算法本身的优劣,应排除其它影响算法效率的因素。

从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。 (原操作在所有该问题的算法中都相同)

T(n)=O(f(n))

上示表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。


求4*4矩阵元素和,T(4)=O(f(4))

f=n*n;


sum(int num[4][4])

{ int i,j,r=0;
for(i=0;i<4;i++)

for(j=0;j<4;j++)

r+=num[i][j]; /*原操作*/

return r;
}


最好情况:
T(4)=O(0)

最坏情况:
T(4)=O(n*n)


ispass(int num[4][4])

{ int i,j;
for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(num[i][j]!=i*4+j+1)

return 0;

return 1;
}

原操作执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数。

语句 频度 时间复杂度
{++x;s=0;} 1 O(1)

for(i=1;i<=n;++i)

{++x;s+=x;}

n O(n)

for(j=1;j<=n;++j)

for(k=1;k<=n;++k)

{++x;s+=x;}

n*n O(n*n)
    O(log n)
   
基本操作的执行次数不确定时的时间复杂度
平均时间复杂度 依基本操作执行次数概率计算平均
最坏情况下时间复杂度 在最坏情况下基本操作执行次数

二、算法的存储空间需求

类似于算法的时间复杂度,空间复杂度可以作为算法所需存储空间的量度。

记作:

S(n)=O(f(n))

若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。

如果所占空间量依赖于特定的输入,则除特别指明外,均按最坏情况来分析。

三、总结

渐近时间复杂度

空间复杂度

时间: 2024-09-02 16:29:43

数据结构教程 第四课 算法效率的度量和存储空间需求的相关文章

数据结构教程 第三课 算法及算法设计要求

本课主题: 算法及算法设计要求 教学目的: 掌握算法的定义及特性,算法设计的要求 教学重点: 算法的特性,算法设计要求 教学难点: 算法设计的要求 授课内容: 一.算法的定义及特性 1.定义: ispass(int num[4][4]) { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(num[i][j]!=i*4+j+1)/*一条指令,多个操作*/ return 0; return 1; }/*上面是一个类似华容道游戏中判断游戏是否结束的算法*/

数据结构教程 第六课 线性表的顺序表示和实现

本课主题: 线性表的顺序表示和实现 教学目的: 掌握线性表的顺序表示和实现方法 教学重点: 线性表的顺序表示和实现方法 教学难点: 线性表的顺序存储的实现方法 授课内容: 复习 1.存储结构 逻辑结构   "数据结构"定义中的"关系"指数据间的逻辑关系,故也称数据结构为逻辑结构. 存储结构   数据结构在计算机中的表示称为物理结构.又称存储结构. 顺序存储结构 链式存储结构 2.线性表的类型定义 一.线性表的顺序表示 用一组地址连续的存储单元依次存储线性表的数据元素

数据结构教程 第十七课 实验三:栈的表示与实现及栈的应用

教学目的: 掌握栈的存储表示方式和栈基本操作的实现方法 教学重点: 栈的基本操作实现方法,栈的应用 教学难点: 栈的存储表示 实验内容: 一.栈的实现 实现栈的顺序存储. 栈实现示例 #include<stdio.h> #include<malloc.h> #include<conio.h> #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OK 1 #define EQUAL 1 #define OVERFL

数据结构教程 第二十三课 二叉树的存储结构

教学目的: 掌握二叉树的两种存储结构 教学重点: 链式存储结构 教学难点: 链式存储二叉树的基本操作 授课内容: 一.复习二叉树的定义 二叉树的基本特征:每个结点的度不大于2. 二.顺序存储结构 #define MAX_TREE_SIZE 100 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; 结点编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 结点值 1 2 3 4 5 0 0 0 0 6 7 0 0

数据结构教程 第四十课 总复习

教学目的: 数据结构综述 教学重点: 数据结构课程的核心 教学难点: 理解概念 授课内容: 一.学习数据结构的意义 设想一下,你决定向一个公司投资,而你对某个公司的了解只限于该公司的一条生产线每分钟可生产2000件产品,你会作出投资的决定吗?如果你是一个公司的管理者,这个公司日常的每笔交易的详细情况对你来讲的确重要,但如果你把时间花在这些数据上面,你就无法站在宏观的高度上把握公司的经营方向. 不管是经营一个公司,还是管理一个国家,对描述事物特征的数据必须加以分析与加工,现实事物是普遍联系的,描述

C#教程第四课:循环控制语句

教程|控制|循环|语句 本节课将介绍如何使用C#控制语句中的循环语句,本课目的如下:1.学会"while"循环的用法. 2.学会"do" 循环的用法. 3.学会"for" 循环的用法. 4.学会foreach循环的用法. 5.进一步了解"break"语句的用法. 6.如何使用"continue"语句. 在C#中,使用"goto"语句并不是一个最佳的建立循环的方法.本节课将介绍建立循环的常

数据结构教程 第二十七课 实验六 二叉树实验

教学目的: 掌握二叉树的链式存储结构 教学重点: 二叉树的链式存储实现方法 教学难点: 授课内容: 生成如下二叉树,并得出三种遍历结果: 一.二叉树的链式存储结构表示 typedef struct BiTNode{ TElemType data; struct BitNode *lchild,*rchild; }BiTNode,*BiTree; 二.二叉树的链式存储算法实现 CreateBiTree(&T,definition); InsertChild(T,p,LR,c); 三.二叉树的递归法

数据结构教程 第八课 线性表的链式表示与实现

本课主题: 线性表的链式表示与实现 教学目的: 掌握线性链表.单链表.静态链表的概念.表示及实现方法 教学重点: 线性链表之单链表的表示及实现方法. 教学难点: 线性链表的概念. 授课内容: 一.复习顺序表的定义. 二.线性链表的概念: 以链式结构存储的线性表称之为线性链表. 特点是该线性表中的数据元素可以用任意的存储单元来存储.线性表中逻辑相邻的两元素的存储空间可以是不连续的.为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指示其直接衙继的信息.这两部分信息组成数据

数据结构教程 第十一课 栈的应用

本课主题: 栈的应用 教学目的: 掌握栈的应用方法,理解栈的重要作用 教学重点: 利用栈实现行编辑,利用栈实现表达式求值 教学难点: 利用栈实现表达式求值 授课内容: 一.栈应用之一:数制转换 将十进制数转换成其它进制的数有一种简单的方法: 例:十进制转换成八进制:(66)10=(102)8 66/8=8 余 2 8/8=1 余 0 1/8=0 余 1 结果为余数的逆序:102 .先求得的余数在写出结果时最后写出,最后求出的余数最先写出,符合栈的先入后出性质,故可用栈来实现数制转换: void