1、一、算法时间复杂性问题1. 试证明下面的定理:(1)如果 f(n)=O(s(n)并且 g(n)=O(r(n),则 f(n)+g(n)=O(s(n)+r(n);(2)如果 f(n)=O(s(n)并且 g(n)=O(r(n),则 f(n)*g(n)=O(s(n)*r(n)根据符号 O 的定义,存在正常数 C1,C2 和自然数 N1,N2,使得对所有的 n=N1,f(n)= N2,g(n) =C2r(n)所以 f(n)+ g(n) = C1s(n)+ C2r(n),f(n)*g(n)= C1C2s(n)r(n);令 C3=max(C1,C2),C4=C1*C2;则:f(n)+ g(n) = C3s(
2、n)+ r(n)=O(s(n)+ r(n)(n)*g(n) = C4*s(n)*r(n)=O(s(n)* r(n)2. 假设某算法在输入规模为 n 时的计算时间为:T(n)=3*2n ,在 A 型计算机上实现并完成该算法的时间为 t 秒,现有更先进的 B 型计算机,其运算速度为 A 型计算机的 64 倍。试求出若在先进的 B 型机上运行同一算法在则 T 秒内能求解输入规模为多大的问题?某台 t 秒内完成的基本运算的次数=3*2n 新机器 t 秒内完成的基本运算的次数=64*3*2n=26*3*2n=3*2(n+6)设 N 为 B 型机上 t 秒钟能求解的问题的规模所以 T=T(N)=3*2N=
3、3*2(n+6) 则:N=n+63. 试说明为什么“在现代计算机上运行指数(如 2n)时间算法是不可能的,要想在顺序处理机上扩大所处理问题的规模, 有效的途径是降低算法计算复杂度的数量级,而不是提高计算机的速度”。一个计算时间为 (1)的算法,它的基本运算执行的次数是固定的,因此,总的时间由一个常数(即,零次多项式)来限界, 而一个时间为(n2)的算法则由一个二次多项式来限界。以下六种计算其关系为(1)(log2n)(n)(nlog2n)(n2)(nn)时间的多项式时间算法是最为常见的,指数时间算法一般有 (2n)、(n!)和 (nn)等。其关系(2n)(n!)(nn)为:其中,最常见的是时间
4、为 (2n)的算法。当 n 取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊因为根本就找不到一个这样的 m,使得 2n 囿界于 nm。换言之,对于任意的 m0,总可以找到 n0,当 nn0 时,有 2nnm。因此, 只要有人能将现有指数时间算法中的任何一个算法简化为多项式时间算法,那就取得了一个伟大的成就。(log2n)、(n)和 (nlog2n)比另外三种时间函数的增长率慢得多。 由这些结果可看出,当数据集的规模(即 n 的取值)很大时, 要在现代计算机上运行具有比 (nlog2n)复杂度还高的算法往往是很困难的。尤其是指数时间算法,它只有在 n 值取得 非常小时才实用。尽管通过
5、提高计算机的速度比之前快 1000 倍,甚至 10000 倍,但当指数规模的 n 足够大时,n 每增加1,1000 倍的提速即可瞬间化为乌有,所以要想在顺序处理机上扩大所处理问题的规模,有效的途径是降低算法的计算复杂度的数量级,而不是提高计算机的速度。2、简答1. 对计算复杂性的研究能够使人们弄清所求解问题的固有难度,并得出评价某类算法优劣的准则,用以指导设计出更高效的算法。试用简短的语言说明“建立一个问题复杂性的下界要比确定它的上界困难得多!”其复杂性上界是已知求解该问题的最快算法的费用,而复杂性下界只能通过理论证明来建立。寻求某个问题的计算复杂性上界,只要研究一个算法的复杂性即可。但是要寻
6、求同一问题的计算复杂性下界,则必须考察所有的解决该问题的算法,证明一个问题的复杂性下界就需要证明不存在任何复杂性低于下界的算法。显然,建立下界要比确定上界困难得多。2. 满足何种性质的问题被称为 NP 完全问题?请简述研究 NP 完全问题的意义;(1) NP 即是多项式复杂程度的非确定性问题。 而如果任何一个 NP 问题都能通过一个多项式时间算法转换为某个 NP 问题, 那么这个 NP 问题就称为 NP 完全问题。如果一个 NP 完全问题能在多项式时间内得到解决,那么 NP 中的每一个问题都可以在多项式时间内解决。(2) NP 完全是指这样一类 NP 问题,所有的 NP 问题都可以用多项式时间
7、划归到他们中的一个.所以显然 NP 完全的问题具有如下性质:它可以在多项式时间内求解,当且仅当所有的其他的 NP完全问题也可以在多项式时间内求解。这样一来,只要我们找到一个 NPC 问题的多项式解,所有的 NP 问题都可以多项式时间内划归成这个 NPC 问题,再用多项式时间解决,这样 NP 就等于 P 了.NP 完全性理论的重要性:知道一个问题是 NP 完全的就给我们提供了有价值的信息,告诉我们采用什么样的途径可以是最富有成效的。一定不要去优先寻找有效的、精确的算法。现在比较适当的途径是集中精力致力于其他较低目标的方法。例如,你可以寻找解决这个问题的各种特殊情况的有效算法。寻找在大多数情况下看
8、来能快速运算的算法,虽然不能保证它在任何情况下都能快速地运算。或者你甚至可以放松问题的某些方面,寻找一个只能给出满足大部分要求的快速算法。简言之,NP 完全性理论的初步应用是帮助算法设计人员找到最有可能得到有用的算法的努力方向3. “当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质”。问题的最优子结构性质是该问题可 用动态规划算法求解的基本要素,试简要阐述“论证某一问题的最优子结构性质”时的一般方法;矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优
9、的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。同一个问题可以有多种方式刻划它的最优子结构,有些表示方法的求解速度更快(空间占用小,问题的维度低)例如:假设n(y1,y2,yn)是 0-1 背包问题的一个最优解,而(y2,yn)是相应子问题的一个最优解,有max vi xii=2n wi xi C - w1 y1i=2x 0,12 i n假设(y2,yn)不是一个最优解,而(z2,zn)是最优解,由此可知,这说明(y1,z1,z2,
10、zn)是问题的整体最优解,与(y1,y2,yn)是最优解矛盾,所以证明了最优子结构性质! 三、算法设计与分析问题 1. 最大值和最小值问题的最优算法(18)给定 n 个实数存放于一维数组 A 中,试设计一个算法在最坏情况下用 3n/2-2 次的比较找出 A 中的最大值和最小值(为简化, 可假设 n 为偶数)。2. 社会名流问题在 n 个人中,一个被所有人知道但却不知道别人的人,被定义为社会名流。现在的问题是如果存在,试找出该社会名流。你可以使用的唯一方式是询问:“对不起,请问你知道那个人吗?”(假定所有回答都正确,甚至这位社会名流也将回答。)我们的最终目标是将询问的数目最小化。给定一个 nn
11、邻接矩阵,确定是否存在一个 i,其满足在第 i 列所有项(除了第ii 项)都为 1,并且第 i 行所有项(除了第 ii 项)都为 0。大致的算法思路:随便取一个非对角线元素比如 Arrayij, 如果 Arrayij=0 成立,则 j 不是社会名流,于是删去第 j 行和第 j 列。同样,如果 Arrayij=1 成立,则删去第 i 行和第 i 列;总之,无论对应项取何值,都可以删去一行和一列,因此整个操作只耗费 O(n)的时间。重复此操作直至剩下最后一个元素。最后,检验该元素是否为社会名流即可。如果该元素不是,则该群人中不存在社会名流。3. 数列极差问题在黑板上写了 N 个正数组成的一个数列,
12、进行如下的操作:每一次任选其中的两个数设为 a 和 b,将其擦去,然后在数列中加入一个新的数 a*b+1,如此下去直至黑板上只剩下一个数为止。在所有按这种操作方式最后得到的数中,最大的数记为Max,最小的数记为 Min,则该数列的极差定义为 M=Max-Min。贪心算法最重要的两个性质是:贪心选择性质和最优子结构性质。贪心选择性质是所求问题的整体最优解可以通过一系列局部最优的选择,也就是贪心选择来达到。而最优子结构性质是指一个问题的最优解包含其子问题的最优解。问题的关键就是 MAX MIN 值的求解问题,所以首先看下怎么样来求 MAX MIN 值。设有三个数 xyz,且 xynum2num3。
13、所以我们可以得出结论:优先选择数列中最小的 2 个数进行(a*b+1)运算得到的值大,优先选择数列中最大的 2 个数进行(a*b+1)运算得到的值小。我们可以把整体的 MAX,MIN 值通过一系列局部求 MAX,MIN 值来求我们想要的结果。我们再看下用贪心策略求解的合理性:假设经(N3)次运算后得到 3 个数:xymax(maxxy),其中 max 是(N2)个数经(N3)次运算后所得的最大值,此时最大值 m (x*y1)max1。若经(N2)次变换后所得的 3 个数为:x y z(zxy)且 z 不为(N2)次变换后的最大值,即 zmax 则所求得的最大值为: m(x*y+1)*z+1,
14、此时 mm(1+x*y)(maxz)0 所以此时不为最优解。 所以若使第 k(1kN1)次变换后所得值最大,必使(k1)次变换后所得值最大(符合贪心策略的最优子结构性质),在进行第 k 次变换时,只需取在进行(k1)次变换后所得数列中的两最小数 x,y 进行运算,再把结果插入到数列即可。所以综上所述:该算法可以简单的描述为:MAX:不断地取当前黑板上的两个最小的数进行运算并且放回,会使最后的结果最大。MIN:不断地取当前黑板上的两个最大的数进行运算并且放回,会使最后的结果最小。数列极差就是:MAX-MIN!算法设计: 先将数列 an按从小到大进行排列(快速排序) 进行最大值的计算:选出 an中
15、最小的两个数进行(a*b+1)运算,在把运算结果按从小到大插入到数列中。一直这样运算,最后就可以得出 MAX 值。 进行最小值的计算:选出 an中最大的两个数进行(a*b+1)运算,在把运算结果按从小到大插入到数列中。一直这样运算,最后就可以得出 MIN 值。 最后该数列的极差 M =MAX-MIN4. 试说明如何修改快速排序算法,使它在最坏情况下的计算时间为 O(nlgn)。可以通过减少递归栈的使用进行优化,快速排序的实现需要消耗递归栈的空间,而大多数情况下都会通过使用系统递归栈来完成递归求解。对系统栈的频繁存取会影响到排序的效率。在数据量较大时,快速排序的复杂度为 O(nlgn)。当数据集较小时,快排的复杂度有向 O(n2)发展的趋势,此时不必继续递归调用快速排序算法,使用插入排序代替快速排序。STL 中sort 就是用的快排+插
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1