数据结构课件第1章.ppt

数据结构课件第1章要点

4)高效率与低存储量需求 通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间,两者都与问题的规模有关。 算法效率的衡量方法和准则 衡量算法效率的方法: 缺点:1.必须执行程序 2.其它因素掩盖算法本质 事后统计法: 事前分析估算法 和算法执行时间有关的因素: 1.算法选用的策略 2.问题的规模 3.编写程序的语言 4.编译程序产生的机器代码的质量 5.计算机执行指令的速度 一个特定算法的“运行工作量” 的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数f(n) 。 算法 = 控制结构 + 原操作 //基本操作 (固有数据类型的操作) 算法的执行时间 = 原操作(i)的执行次数×原操作(i)的执行时间 算法的执行时间 与 原操作执行次数之和 成正比 从算法中选取一种对于所研究的问题来说是 基本操作 的原操作,以该基本操作 在算法中重复执行的次数 作为算法运行时间的衡量准则。 表示随着问题规模的增大,算法执行时间增长增长率和 f(n)相同,称作算法的渐近时间复杂度,简称为时间复杂度。 一般情况下,算法中基本操作执行的次数是问题规模n的某个函数f(n),算法的时间量度记作: T (n) = O(f(n)) ( M 是0的常数) 也可以用: 如何估算算法的时间复杂度? 例:2n3+1000n2+1=O(n3) 1000n2+n+1000000= O(n2) 例 一 两 个 矩 阵 相 乘 void mult(int a[], int b[], int c[] ) { // 以二维数组存储矩阵元素,c 为 a 和 b 的乘积 for (i=1; i=n; ++i) for (j=1; j=n; ++j) { c[i][j] = 0; for (k=1; k=n; ++k) c[i][j] += a[i][k]*b[k][j]; } //for } //mult 基本操作: 乘法操作 时间复杂度: O(n3) 例 二 冒 泡 排 序 基本操作: 交换两个相邻元素的操作 时间复杂度: O(n2) void bubble_sort(int a[ ], int n) {// 将 a 中整数序列重新排列成自小至大有序的整数序列。 for (i=n-1, change=TRUE; i=1 change; --i) } // bubble_sort { change = FALSE; // change 为元素进行交换标志 for (j=0; ji; ++j) if (a[j] a[j+1]) { a[j] ←→ a[j+1]; change = TRUE ;} } // 一趟冒泡 交换次数: 最好情况:0 最坏情况:n(n-1)/2 最坏情况下的时间复杂度 平均时间复杂度 若不特别说明,以后我们所说的都是最坏情况下的时间复杂度 常见函数的时间复杂度按数量递增排列及增长率。 常数阶O(1) 对数阶O(log2n) 线性阶O(n) 线性对数阶O(nlog2n) 平方阶O(n2) 立方阶O(n3) …… 多项式阶O(nk) 指数阶O(2n) 1.10 按增长率由小到大的排列顺序是: (2/3)n , 2100, log2(log2n) , log2n , (log2n)2, , n2/3, n/log2n , n , nlog2n , n3/2, (4/3)n , (3/2)n , n log2n , n! , nn 解题依据为: 4) 算法的存储空间需求 算法的空间复杂度定义为: 表示随着问题规模 n 的增大,算法运行所需存储量的增长率与 g(n) 的增长率相同。 S(n) = O(g(n)) 算法的存储量包括: 输入数据所占空间 程序本身所占空间 辅助变量所占空间 若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。 若需存储量依赖于特定的输入,则通常按最坏情况考虑。 若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作。例如在进行冒泡排序时所需的额外的空间就是一个常数,空间复杂度为O(1)。 本章小结 1.基本概念和术语 数据、数据元素、数据项、数据结构、数据对象、数据结构(逻辑结构、存储结构、运算)、多形数据类型、抽象数据类型(定义、表示和实现) 2.抽象数据类型:描述、类-C中的基本语句和函数 3.算法:算法的

文档评论(0)

1亿VIP精品文档

相关文档