当前位置:文档之家› 算法复杂性分析

算法复杂性分析


O(1)<O(logn)<O(n)< O(nlogn) <O(n2)<O(2n)<O(n!)
数据结构 —计算复杂性分析
本讲提纲
算法复杂性概念与定义
算法复杂性的渐进性态及大O表示法 算法复杂性分析方法
空间复杂性分析方法 时间复杂性分析方法
数据结构 —计算复杂性分析
空间复杂性分析方法
空间复杂性:问题实例所有参数所占据的存储空
【例:竞技淘汰算法记数】
输入:选手成员group[],选手个数n(n=2k) 输出:冠军的选手 1. Type game(Type group[],int n) 2. { 3. int j,i = n; 4. while (i>1) { 5. i = i / 2; 6. for (j=0;j<i;j++) 7. if (comp(group[j+i],group[j])) 8. group[j] = group[j+i]; 9. } 10. return group[0]; 11. }
数据结构 —计算复杂性分析
(2)迭代算法
int fib(n) { int i,f1=1,f2=1,f3; if(n==1||n==2) { printf ("1"); } else { for(i=0;i<n - 2;i++) { f3=f1+f2; //f1 f2 表示当前的值 f1=f2; f2=f3; } return f3 }
1. template <class Type>
第8行开始的内部for循环的循环体, 其执行次数依次为:
2. void shuffle(Type A[],int n) 3. { 4. int i,k,m,d; 5. random_seed(0); 6. for (k=1;k<=n;k++) { 7. m=n/k; 8. for (i=1;i<=m;i++) { 9. d = random(1,n); 10. swap(A[i],A[d]); 11. } 12. } 13. }
N N
Tmin ( N ) minT ( N , I ) min ti ei ( N , I ) ti ei ( N , I ) T ( N , I )
I DN I DN i 1 i 1
k
k
~
~
Tavg ( N )
I DN
P(I )T ( N , I ) P(I )t e (N , I )
数据结构 —计算复杂性分析
斐波那契数列问题
1 1
兔子数列
请大家设计一个算法,求解斐波那契数列第n项的值。
数据结构 —计算复杂性分析
(1)递归算法
int fib(n) { if(n == 1|| n== 2) { return 1; } else { return fib(n-1) + fib(n- 2); } }
i i I DN i 1
k
数据结构 —计算复杂性分析
本讲提纲
算法复杂性概念与定义
算法复杂性的阶及大O表示法 算法复杂性分析方法
数据结构 —计算复杂性分析
算法复杂性的渐近性态
算法复杂性的渐近性态:对于F(N),如果存在F’(N),使得 当N→∞时有:
(F(N )-F’(N )) / F(N ) → 0
计算机硬件环境影响算法的 评判。我们评的是算法,不 是计算机速度。就是不同计 算机上运行,同一个算法的 复杂度应该是一样的。一个 算法常常是针对一个问题来 设计的,但同一问题规模不 同时计算时间也不一样。
算法的本质特性 是 什 么?
数据结构 —计算复杂性分析量算法计算难度的一种尺度,反映了算法消耗的资源情况。 用N、I 来表示算法要解决问题的规模和算法的输入,用C表示 算法的复杂性,有:C =F(N,I)
O(?)
数据结构 —计算复杂性分析
时间复杂性分析方法
估算算法运行时间的方法
迭代计数:计算循环的迭代次数
操作计数:找出关键操作,确定 这些关键操作所需要的执行次数
数据结构 —计算复杂性分析
常用的级数公式及复杂度
数据结构 —计算复杂性分析
【例:多重循环算法记数】
x=1; for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x++;
数据结构
第二讲 计算复杂性
2.2 算法复杂性分析
清华大学 自动化系 黄双喜 博士
huangsx@
数据结构 —计算复杂性分析
How many Algorithms we have?
排序算法
• 冒泡排序、插入排序、桶排序、计数排序、 归并排序、基数排序、希尔排序、堆排序、 快速排序
if(n==1||n==2) { printf ("1"); } else { for(i=0;i<n - 2;i++) { f3=f1+f2; //f1 f2 表示当前的值 f1=f2; f2=f3; } 迭代次数: n-2次 return f3 }
递归次数:2Fib(n)-1 (为什么?)
F (100) 354224848179261915075
13 15 18
n!
6.2*109 1.3*1012 6.4*1015
运算时间
约1秒 约325秒 约23天
20
2.4 1018
约190年
*兴趣阅读:克雷数学研究所的世界七大数学难题(P=NP?)
数据结构 —计算复杂性分析
如何评价算法好与坏?
能否直接在计算机上运行 算法,通过记录运算时间 来评判算法好坏呢?
百钱百鸡问题
中国古代数学家张丘建在他的《算经》中提出 了他的著名的“百钱百鸡问题”:鸡翁一,值 钱五;鸡母一,值钱三;鸡雏三,值钱一;百 钱买百鸡,翁、母、雏各几何?
算法一
算法二
数据结构 —计算复杂性分析
计算机能解决算法问题吗?
• 问题:一个商人欲到n个城市推销商品, 每两个城市i和j之间的距离为dij,如何选 择一条道路使得商人每个城市走一遍后 回到起点且所走路径最短(每个城市只 经过一次)? • 枚举算法:n个城市的一个排列表示商人 按这个排列顺序推销并返回起点。
? 怎么设计出来的? ? ? 给你一个新问题,能设计出算法吗? ? 怎么去设计一个算法呢? ? 怎么去设计一个优秀的算法呢?
怎么想到的?
算法 分析 与设 计能 力
数据结构 —计算复杂性分析
本讲提纲
算法复杂性概念与定义 算法复杂性的阶及大O表示法 算法复杂性分析方法
算法有好坏之 份吗?如何理 解算法之美?
旅行商问题 (TSP)
数据结构 —计算复杂性分析
旅行商问题(TSP)
• 固定一个城市为起终点,则需要(n-1)!次枚举。若用一台每秒可运 算40亿次(40*108)的计算机来计算,完成15个城市枚举需要325 秒,18个城市就已经变成23天,计算20个城市的时间我们已经不能 忍耐:190年!!!
N
n n n n T ( n ) j 2 4 n j 1 2
n( 1 1 1 k ) 2 4 2
1 2
k
k
n (1
)
n 1
O(n)
分析comp(group[j+i],group[j])的运行次数
数据结构 —计算复杂性分析
【例:随机洗牌算法】
输入:牌A[],牌的张数n 输出:洗牌后的牌A[]
搜索算法 图算法
其他
• 顺序查找、折半查找、二叉树查找、 索引查找、散列查找 • 广度/深度优先算法、最小生成树算法、 最短路径算法、最大流算法 • 矩阵运算、方程求解、优化算法、-------
数据结构 —计算复杂性分析
How much do you know about algorithms
算法 复杂 性理 论
我们说F’(N)是F(N)当N→∞时的渐近性态
例:F(N)=3N2+4Nlog2N +7,求F’(N)
F’(N)的一个答案是3N2,因为这时有:
(F(N )-F’(N )) / F(N )
数据结构 —计算复杂性分析
时间复杂性渐进表示法
定义1:如果存在两个正常数c和n0,对于所有的n≥n0,有:f(n)≤cg(n), 则记作:f(n) = Ο(g(n)) 定义2:如果存在两个正常数c和n0,对于所有的n≥n0,f(n) ≥cg(n),则记作: f(n) = Ω(g(n))
间之和。
在二进制编码条件下,任意正整数x占用位数为:
考虑一个符号位和一个数据分隔位,任何一个整数x的 输入规模为:
数据结构 —计算复杂性分析
【例】TSP实例规模的计算
对于TSP问题,它的任何一个实例由城市数n和城市间的
距离D确定。
TSP的任何一个实例I的规模(考虑符号和数据分隔位) 为:
定义3:如果存在正常数c1,c2和n0,对于所有的n≥n0,有c1g(n)≤ f(n) ≤
c2g(n),则记作: f(n) = (g(n))
数据结构 —计算复杂性分析
常见的算法复杂度的大O阶
O(1): 表示算法的运行时间为常量
O(logn): 二分搜索算法 O(n): 表示该算法是线性算法 O(nlogn): 快速排序算法 O(n2): 对数组进行排序的简单算法, 如直接插入排序算法。 O(n3): 做两个n阶矩阵的乘法运算 O(2n): 求具有n个元素集合的所有子集 的算法 O(n!): 求具有N个元素的全排列的算法
相关主题