算法设计与分析基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析基本方法
• 算法原理及应用
计算复杂性
计算复杂性研究计算机可解问题的效率(解决问题所 需的时间和空间) 计算复杂性包括时间复杂性和空间复杂性。 可解的问题并不一定是实际可接受的。
例:求26个小写字母的所有排列。
共有26!种不同排列,设计算机每秒可完成109种排列的 计算,共需要花多少时间才能完成所有计算? 26!≈4x1026 一年共有365x24x3600秒=3.1586x107秒 大约要花1.2x1010年。
来自百度文库法分析基本方法
• 算法原理及应用
停机问题证明 伪代码表示如下 int H(procedure,Input); // 这里的H函数返回1:死循环;0:停机 int K(P) { if (H(P,P) == 1){ return 0; // 如果H死循环,这里会停机 }else{ while(1){} // 这里会死循环 } } 现在假设求K(K),则若H(K, K)输出停机,K(K)死循环,但由定义知二 者矛盾。反之,H(K, K)输出死循环,则K(K)停机,两者一样矛盾。 因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。
停机问题:给定一个带输入的计算机程序,它会 停机吗?(由英国数学家Turing 证明该问题计算 机不可解)
如果这个问题可以在有限的时间之内解决,那么就可以 有一个程序判断其本身是否会停机。但是,在程序停止 之前,没有办法判断它会不会停止。所以这是一个不可 解的问题。
算法分析基本方法
• 算法原理及应用
2.底函数和顶函数 (2.4
● 相关性质: (1)
P45)
x/2 x/2 = x , x为整数
(2) - x -x - x -x , x为实数
(3) 定理2.1 设f(x)是单调递增连续函数,使得若f(x)是整数,则x是
整数。那么,
f x f(x)
停机问题证明 设停机问题有解,即:存在过程H(P, I)可以给出 程序P在输入I的情况下是否可停机。假设若P在输 入I时可停机,H输出“停机”,反之输出“死循 环”,即可导出矛盾: 显然,程序本身可以被视作数据,因此它可以被 作为输入,故H应该可以判定当将P作为P的输入 时,P是否会停机。所以我们设过程K(P)的流程如 下:首先,它调用H(P, P),如果H(P, P)输出“死 循环”,则K(P)停机,反之K(P)死循环。即K(P)做 与H(P, P)的输出相反的动作。
• 算法原理及应用
void select_sort(int& a[], int n) { // 将 a 中整数序列重新排列成自小至大有序的整数序列。
for ( i = 0; i< n-1; ++i ) { j = i; // 选择第 i 个最小元素 for ( k = i+1; k < n; ++k ) if (a[k] < a[j] ) j = k; if ( j != i ) a[j] ←→ a[i] } 基本操作: } // select_sort 比较(数据元素)操作
算法原理及应用
——算法设计与分析基础之一
算法设计与分析基础
• 算法原理及应用
内容
算法分析基本方法
常用算法设计技术
算法分析基本方法
• 算法原理及应用
算法
D.E.Knuth的非形式化定义 一个算法,就是一个有穷规则(指令)集合。它 为某个特定类型问题提供了解决问题的运算序列。 算法的五个特性 1. 有穷性 2. 确定性 4. 输出 5. 输入
0.08秒 6.4天
0.008秒 20秒
算法分析基本方法
• 算法原理及应用
时间复杂性的概念
算法的时间复杂性指算法中元运算的执行次 数,其 为问题规模的函数。 元运算(定义1.1, P14) 常见的元运算:基本算术运算、逻辑运算、赋值 运算等。 问题规模通常指输入大小(输入数据量的大小)。
(自行复习)
2.底函数和顶函数 (2.4)
设x为实数。 ●底函数 ●顶函数 例: :小于或等于x的最大整数。 x :大于或等于x的最小整数。 x
3.9
- 3.9
3.9
- 3.9
=3
=-4
=4
=-3
数学预备知识
• 算法原理及应用
一. 算法分析中相关的数学工具 (2.1~2.7)
f(n)=Θ(g(n)): f(n)的增长率等于g(n), f(n)的阶=g(n)的阶。 在忽略常数因子的情况下,O, Ω, Θ分别提供 了算法 运 行时间的一个上界、下界、确切界限。
算法分析基本方法
• 算法原理及应用
时间复杂性的阶
根据Θ可将算法分类,同阶的算法属同一 复杂性类(等价类)。 常见的算法复杂性的阶
Θ(1) Θ(n) Θ(np) Θ(log n) Θ(an) Θ(n!) Θ(nn)
其中,p, q>0 , a>1。 阶的大小的比较: 常用阶的比较
Θ(np logq n)
算法分析基本方法
• 算法原理及应用
时间复杂性的阶
阶的比较方法:根据O, Ω, Θ的定义,利用已知结论, 利用极限运算等。
该方程的解为C(n)=1+ log 2 n 。 该算法的时间复杂性为O(log n)。
算法分析基本方法
• 算法原理及应用
最坏情况和平均情况时间复杂性的估计
最坏情况下时间复杂性 W(n)= maxt (I)
IDn
其中,Dn是大小为n的输入集合, t(I)是输入为I时算法的运算时间。
算法分析基本方法
Θ(np)称多项式阶,Θ(logq n)称对数阶,Θ(an)称指数阶。
算法分析基本方法
• 算法原理及应用
时间复杂性的阶
函数阶的估计:
取最高阶的项估计,且可忽略常数因子 。
例:f(n)=amnm + am-1nm-1+…+ a1n + a0
利用不等式估计:
例1.12, 1.13 (P17-18)
• 算法原理及应用
最坏情况和平均情况时间复杂性的估计
平均情况下时间复杂性
A(n)
IDn
p(I)t(I)
其中,Dn是大小为n的输入集合,
t(I)是输入为I是时算法的运算时间,
p(I)是输入I出现的概率。
数学预备知识
• 算法原理及应用
一. 算法分析中相关的数学工具 (2.1~2.7)
1. 集合、关系、函数、对数和证明方法
f(n)= Θ(g(n))当且仅当 f(n)= O(g(n)) 且 f(n)= Ω(g(n))
算法分析基本方法
• 算法原理及应用
时间复杂性的概念
增长率(在忽略常数因子的前提下)
f(n)=O(g(n)): f(n)的增长率不高于g(n), f(n)的阶<=g(n)的阶。
f(n)=Ω(g(n)): f(n)的增长率不低于g(n), f(n)的阶>=g(n)的阶。
算法分析基本方法
两个本质上相似的悖论:
• 算法原理及应用
理发师悖论:村子里有个理发师,这个理发师有条原则 是,对于村里所有人,当且仅当这个人不自己理发,理 发师就给这个人理发。如果这个人自己理发,理发师就 不给这个人理发。无法回答的问题是,理发师给自己理 发么?
停机测试悖论:计算机里有个测试程序,这个测试程序 的原则是,对于计算机里所有程序,当且仅当这个程序 不递归调用自己(输出停机),测试程序就调用它(对应 不停机)。如果这个程序递归调用自己(对应不停机), 测试程序就不调用它(对应停机)。无法回答的问题是, 测试程序递归调用自己么?
算法分析基本方法
• 算法原理及应用
空间复杂性
算法的空间复杂性指算法执行过程中所 需的内存空间 (即辅助空间),不包括存储输入所用的空间。
空间复杂性的分析类似于时间复杂性。
时间和空间资源的权衡
算法分析基本方法
• 算法原理及应用
算法时间复杂性的估计
计算迭代(循环)次数 算法的时间复杂性往往取决于算法所执行的循环 次数,该情况下只要计算算法中最大的循环次数。 基本运算:(定义1.6 P24) 例:基于比较的查找和排序算法中的比较运算。 利用递推(递归)关系
n
●帕斯卡三角形 (图2.1 P48)
数学预备知识
一. 算法分析中相关的数学工具 (2.1~2.7)
4. 鸽巢原理 (P48)
● 定理2.3 (鸽巢原理) 如果把n个球分别放在m个 盒子中,那么:
• 算法原理及应用
n m 个球; (2) 存在一个盒子,必定最多装 n m 个球;
计算算法的基本运算的频度
递归算法的时间复杂性满足递归关系,通过解递 归方程可求的算法的时间复杂性。
算法分析基本方法
• 算法原理及应用
利用递推(递归)关系
例:二分查找: 算法1.2 (p5)
该算法的最大比较次数C(n)满足如下递归方程:
C(n) C n 2 1 , n 1 , n 1 C(n) 1
• 算法原理及应用
从算法中选取一种对于所研究的问
题来说是 基本操作 的原操作,以该
基本操作 在算法中重复执行的次数 作为算法运行时间的衡量准则。
例 一 两 个 矩 阵 相 乘 void mult(int a[], int b[], int& c[] ) {
• 算法原理及应用
// 以二维数组存储矩阵元素,c 为 a 和 b 的乘 积
3. 可行性
算法分析基本方法
• 算法原理及应用
可计算性
可计算性理论研究问题的可解性。 “几乎所有”的问题都计算机不可解。 可解问题集合为可数的(对应整数集) 所有问题集合为不可数的(对应实数集) 不可解问题集合为不可数的。
算法分析基本方法
• 算法原理及应用
可计算性
不可解问题之例:
时间复杂度:
O(n2)
例 三
• 算法原理及应用
起 泡 排 序
void bubble_sort(int& a[], int n) { // 将 a 中整数序列重新排列成自小至大有序的整数序列。 for (i=n-1, change=TRUE; i>1 && change; --i) { change = FALSE; // change 为元素进行交换标志 for (j=0; j<i; ++j) if (a[j] > a[j+1]) { a[j] ←→ a[j+1]; change = TRUE ;} } // 一趟起泡 } // bubble_sort
算法分析基本方法
• 算法原理及应用
计算复杂性
对于实际可接受的同一问题,不同算法可能在效率上 有很大差异。(当问题规模充分大时)
例1.4 两种排序算法的比较 (P12)
n (排序数据个数) SELECTSORT (选择排序) MERGESORT (归并排序)
n=128时的比较时间 n=220时的比较时间
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)
基本操作:
算法分析基本方法
时间复杂性的概念
• 算法原理及应用
从实际出发,算法的时间复杂性分析不必精确计 算(近似的),而且只关心问题规模充分大时的情况 (增长率)。 算法的渐进时间复杂性指当问题规模充分大时, 对时 间复杂性的估计,用O, Ω, Θ估计。 O, Ω, Θ的定义(P15-16 定义1.2-1.4) f(n)= Ω(g(n)) 当且仅当 g(n)=O(f(n))
● 定理2.1的应用 (P45)
且
f x f(x)
数学预备知识
• 算法原理及应用
一. 算法分析中相关的数学工具 (2.1~2.7)
3. 阶乘和二项式系数(排列和组合)
● Stirling公式: n!
2n n e
n n n 0 1
n
●关于二项式系数的有关公式:
n n k n - k
n n -1 n -1 k k k -1
1 x
n
n j j x j0