pascal.时间复杂度的计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
时间复杂度的计算
当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。
常见算法时间复杂度:
O(1):表示算法的运行时间为常量
O(n):表示该算法是线性算法
O(㏒2n):二分查找算法
O(n2):对数组进行排序的各种简单算法,例如直接插入排序的算法。
O(n3):做两个n阶矩阵的乘法运算
O(2n):求具有n个元素集合的所有子集的算法
O(n!):求具有N个元素的全排列的算法
优<---------------------------<劣
O(1) 时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、 线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、……k次方阶O(n k)、指数阶O(2n)。 考察下面三个程序段: 例1x= x+1; 例2 for i=1 to n x= x+1; 例3 for i:=1 to n for j=1 to n x= x+1; 其时间复杂度分别为O(1)、O(n)、O(n2)。分别称为常量阶、线性阶、平方阶。 算法中还可能呈现的时间复杂度有:对数阶O(log n)、指数阶O(2n)等。 各种排序的时间复杂度: 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。 冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。 直接插入排序:O(n*n) 选择排序:O(n*n) 快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的。 归并排序:log2(n)*n 堆排序:log2(n)*n 希尔排序:算法的复杂度为n的1.2次幂 下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。 排序法平均时间最差情形稳定度额外空间备注 冒泡O(n2) O(n2) 稳定O(1) n小时较好 交换O(n2) O(n2) 不稳定O(1) n小时较好 选择O(n2) O(n2) 不稳定O(1) n小时较好 插入O(n2) O(n2) 稳定O(1) 大部分已排序时较好 基数O(logRB) O(logRB) 稳定O(n) B是真数(0-9),R是基数(个十百) Shell O(nlogn) O(ns) 1 快速O(nlogn) O(n2) 不稳定O(nlogn) n大时较好 归并O(nlogn) O(nlogn) 稳定O(1) n大时较好 堆O(nlogn) O(nlogn) 不稳定O(1) n大时较好