算法复习
《算法初步》复习

一般而言 对一类问题的机械的统 , 一的求解方法称为 算法
a lg orithm
描述算法主要有三种方式:
自然语言 流程图 程序设计语言
1、找到某种算法是指使用一系列运算规则,能在有限
步骤内求解某类问题,并且其中的每条规则必须是明 确定义的、可行的。
2、算法从初始步骤开始,每一个步骤只能有一个确定
如图, 虚线框内是一个顺序结构.其中A 和B两个框是依次执行的.顺序结构是 一种最简单、最基本的结构.
A B
先根据条件作出判断, 再决定执行哪 一种操作的结构称为 选择结构 ( selection structure) 或称为" 分支结构" .
如图所示, 虚线框内是一个选择结 , 构 它包含一个判断框当条件 p 成立(或 , 称为" 真" ) 时执行 A , 否则执行 B .
四、循环语句
当循环的次数已经确定 可用 For " 语句表示." For" , " 语句的一般形式为 : For I From " 初值"To " 终值" Step "步长" End For .
当循环次数不能确定时可 , 用"While " 语句来实现循环 . "While "的一般形式为 While A End While , 其中A表示判断执 行循环 的条件.
条 件 结 构
循 句
循 环 语 句
()
算法的基本思想就是探 求解决问题的一般方法 , 并将解决问题的步骤用 具体化、程序化的语言 加以表述.
描述算法的方式经历了 从简单的自然语言向高 级的计算机程序语言的 发展过程自然语言通俗 . 易懂, 直接明了 流 程图直观 形象, 能 体现算法过 ; 程的结构特征; 伪代 码 将 流 程图的各结构用接 近计算机程序语言的算 法语句进行表述 为编制 , 算机程序提供了便利 .
算法(复习题)1

平均情况:设待查找的元素在数组中的概率为P,不在数组中的概率为1-P,若出现在数组中每个位置的概率是均等的为p/nT(n)=P1D1+P2D2+...+PiDi+(1-P)Dn+1=p/2+n(1-p/2)1.叙述分治算法和动态规划算法的基本思想,并比较两种算法的异同。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解. 动态规划将待求解的问题分解成若干的子问题,自底向上地通过求解子问题的解得到原问题的解。
动态规划将每个子问题只求解一次并将其解保存在一个表格中,当需要再次求解此子问题时,只是简单的通过查表过的该子问题的解,避免了大量的重复计算.异同:分治法求解的问题分解后的子问题都是独立的,而使用动态规划求解的问题分解后得到的子问题往往不是相互独立的。
分治法是自顶向下用递归的方法解决问题,而动态规划则是自底向上非递归解决问题。
1.简述分治算法求解过程的三个阶段。
答:(1)划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。
(2)求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。
(3)合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。
2.叙述分治法的基本思想,并分析分治法与减治法二者的区别。
答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解.区别:分治法是把一个大问题划分成若干个子问题,分别求解各个子问题,然后把子问题的解进行合并并得到原问题的解。
减治法同样是把一个大问题划分成若干个子问题,但是这些子问题不需要分别求解,只需求解其中的一个子问题,因而也无需对子问题的解进行合并。
计算机算法与设计复习题(含答案)

1、一个算法的优劣可以用(时间复杂度)与(空间复杂度)与来衡量。
2、回溯法在问题的解空间中,按(深度优先方式)从根结点出发搜索解空间树。
3、直接或间接地调用自身的算法称为(递归算法)。
4、 记号在算法复杂性的表示法中表示(渐进确界或紧致界)。
5、在分治法中,使子问题规模大致相等的做法是出自一种(平衡(banlancing)子问题)的思想。
6、动态规划算法适用于解(具有某种最优性质)问题。
7、贪心算法做出的选择只是(在某种意义上的局部)最优选择。
8、最优子结构性质的含义是(问题的最优解包含其子问题的最优解)。
9、回溯法按(深度优先)策略从根结点出发搜索解空间树。
10、拉斯维加斯算法找到的解一定是(正确解)。
11、按照符号O的定义O(f)+O(g)等于O(max{f(n),g(n)})。
12、二分搜索技术是运用(分治)策略的典型例子。
13、动态规划算法中,通常不同子问题的个数随问题规模呈(多项式)级增长。
14、(最优子结构性质)和(子问题重叠性质)是采用动态规划算法的两个基本要素。
15、(最优子结构性质)和(贪心选择性质)是贪心算法的基本要素。
16、(选择能产生最优解的贪心准则)是设计贪心算法的核心问题。
17、分支限界法常以(广度优先)或(以最小耗费(最大效益)优先)的方式搜索问题的解空间树。
18、贪心选择性质是指所求问题的整体最优解可以通过一系列(局部最优)的选择,即贪心选择达到。
19、按照活结点表的组织方式的不同,分支限界法包括(队列式(FIFO)分支限界法)和(优先队列式分支限界法)两种形式。
20、如果对于同一实例,蒙特卡洛算法不会给出两个不同的正确解答,则称该蒙特卡洛算法是(一致的)。
21、哈夫曼编码可利用(贪心法)算法实现。
22概率算法有数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法23以自顶向下的方式求解最优解的有(贪心算法)24、下列算法中通常以自顶向下的方式求解最优解的是(C)。
算法复习题

算法复习试题一、名词解释:1、算法:就是一组有穷的规则,它规定了解决某一特定类型问题的一系列运算。
2、贪心算法:能够得到某种量度意义下的最优解的分级处理方法称为贪心算法。
3、分治法:分治法的求解思想就是把整个问题分成若干个小问题后分的治之4、递归过程:一个递归过程的执行类似于多个子程序的嵌套调用,递归过程是自己调用自己本身代码。
递归算法的特点:思路清晰,算法的描述简洁且易理解。
5、集合:在研究某一类对象时,可把这类对象的整体称为集合。
6、生成树:设G=(V,E)是一个无向连通图。
如果G的生成子图T=(V,E')是一棵树,则称T是G的一棵生成树。
7、算法具有以下5个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口可行性:就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
8、迭代法:称辗转法,是一种不断用变量的旧值递推出新值的解决问题的方法。
9、贪婪法: 是一种不追求最优解,只希望得到较为满意解的方法。
贪婪法不要回溯10、动态规划:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
11、分支限界法:是一种用于求解组合优化问题的排除非解的搜索算法。
12、树:树是一个或多个结点的有限集合。
12、二元树:它是结点的有限集合,它或者为空,或者由一个根和两棵树(左子树和右子树)的不相交的二元树所组成。
13、二分检索树:T是一棵二元树,它或者为空,或者其每个结点含有一个可比较大小的数据元素。
14、图:图是数据结构,一个图G是由称之为结点V和边E的两个集合组成的15、最优解:使目标函数取极值(极大值或极小值)的可行解。
算法期末复习重点及答案

1.假设某算法在输入规模为n时的计算时间为T(n)=3*2n,在某台计算机上实现并完成该算法的时间为t秒。
现有另一台计算机,其运行速度是第一台的64倍,那么在新机器上用同一算法在t秒内能解输入规模为多大的问题。
2.若上述算法的计算时间改进为t(n)=n2,其余条件不变,则新机器上用t秒能解问题的规模。
3. 若上述算法的计算时间改进为t(n)=8,其余条件不变,则新机器上用t秒能解问题的规模。
⏹N+6⏹8*n⏹任意规模6☐61到n平方的累加和☐2)基本语句:s=s+i*i;☐3)执行次数:n次☐4)效率类型:时间复杂度为线性阶☐5)利用数学公式进行改进:s=n*(n+1)*(2*n+1)/6⏹时间效率为O(1)7☐)☐T(n)=3T(n-1)☐=3(3T(n-2))=32*T(n-2)☐=……☐=3k T(n-k)☐设n-k=1,则k=n-1☐T(n)=3n-1*T(1)=4*3n-1=O(3n)8☐8. Int Q(int n)☐{▪If(n==1) return 1;▪Else return Q(n-1)+2*n-1;☐}⏹1)求n2⏹2) n=3 Q(3)=Q(2)+2*3-1⏹=(Q(1)+2*2-1)+5⏹=(1+4-1)+5=9⏹3)Q(n)=Q(n-1)+2*n-1⏹=(Q(n-2)+(2*(n-1)-1))+2*n-1=Q(n-2)+2(2n-2)⏹=Q(n-3)+3(2n-3)=….=Q(n-k)+k(2n-k)⏹设n-k=1 则k=n-1⏹Q(n)=1+(n-1)(2n-n+1)=1+n2-1=n2⏹4)非递归算法: return n*n;。
算法与程序设计复习知识点

算法与程序设计复习知识点算法与程序设计复习知识点1. 算法基础1.1. 算法的定义算法是解决特定问题的一系列清晰指令的有限序列,用来描述解决问题的步骤和方法。
1.2. 算法的特性输入:一个算法必须具有零个或多个输入。
输出:一个算法必须具有一个或多个输出。
明确性:算法的每一步骤必须清晰明确,无二义性。
有限性:算法必须在有限的步骤之后终止。
可行性:算法的每一步都可以通过执行有限次来完成。
1.3. 算法的复杂度算法的复杂度是衡量算法性能的指标,主要包括时间复杂度和空间复杂度。
时间复杂度:描述算法执行所需的时间量与输入数据规模之间的关系。
空间复杂度:描述算法执行所需的存储空间量与输入数据规模之间的关系。
2. 程序设计基础2.1. 编程语言选择合适的编程语言,根据问题需求和自身编程经验选择合适的语言,常见的编程语言包括C、C++、Java、等。
2.2. 数据类型在程序中使用合适的数据类型可以更好地组织和操作数据,常见的数据类型有:整型、浮点型、字符型、字符串型、数组、结构体、指针等。
2.3. 控制结构控制结构用来控制程序的执行流程,主要包括选择结构(if-else语句、switch语句)和循环结构(for循环、while循环)。
2.4. 函数函数是一段独立完成特定任务的代码块,函数可以提高代码的重用性和可维护性,降低代码的复杂度。
2.5. 数据结构数据结构是组织和存储数据的方式,不同的数据结构适用于不同的问题场景,常见的数据结构包括数组、链表、栈、队列、树、图等。
3. 常见算法3.1. 排序算法常见的排序算法包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。
3.2. 查找算法常见的查找算法包括:顺序查找、二分查找、哈希查找等。
3.3. 图算法常见的图算法包括:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)等。
3.4. 动态规划动态规划是一种将复杂问题分解为简单子问题的方法,通过解决子问题来解决原始问题,常见的动态规划问题包括背包问题、最长公共子序列问题等。
算法期末复习题2

填空题:1.一个算法就是一个有穷规则的集合,其中之规则规定了解决某一特殊类型问题的一系列运算,此外,算法还应具有以下五个重要特性:确定性有穷性可行性 0个或多个输入一个或多个输出2.算法的复杂性有时间复杂性和空间复杂性之分,衡量一个算法好坏的标准是时间复杂度高低。
3.某一问题可用动态规划算法求解的显著特征是该问题具有最优子结构性质。
5.用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解6.动态规划算法的基本思想是将待求解问题分解成若干子问题_,先求解子问题,然后从这些子问题的解得到原问题的解。
7.以深度优先方式系统搜索问题解的算法称为回溯法。
8.0-1背包问题的回溯算法所需的计算时间为o(n*2n),用动态规划算法所需的计算时间为o(min{nc,2n})。
9.动态规划算法的两个基本要素是最优子结构和重叠子问题。
10.二分搜索算法是利用动态规划法实现的算法。
11.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有时间复杂性和空间复杂性之分。
12.出自于“平衡子问题”的思想,通常分治法在分割原问题,形成若干子问题时,这些子问题的规模都大致相同。
13.动态规划算法有一个变形方法备忘录方法。
这种方法不同于动态规划算法“自底向上”的填充方向,而是“自顶向下”的递归方向,为每个解过的子问题建立了备忘录以备需要时查看,同样也可避免相同子问题的重复求解。
14、这种不断回头寻找目标的方法称为回溯法。
15、直接或间接地调用自身的算法称为递归算法。
16、 记号在算法复杂性的表示法中表示渐进确界或紧致界。
17、由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
18、建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。
19、下列各步骤的先后顺序是②③④①。
①调试程序②分析问题③设计算法④编写程序。
20、最优子结构性质的含义是问题的最优解包含其子问题的最优解。
算法-复习题【选择题】

一、选择题1. 通俗地讲,算法是指解决问题的一种方法或一个过程,描述算法的方式有很多,如( )。
A 、自然语言方式B 、表格方式C 、程序设计语言D 、程序设计语言与自然语言相结合算法的描述方式(常用的) 算法描述 自然语言流程图 特定的表示算法的图形符号伪语言 包括程序设计语言的三大基本结构及自然语言的一种语言类语言 类似高级语言的语言,例如,类PASCAL 、类C 语言 2.算法的复杂性依赖于( )。
A 、要解决问题的规模B 、算法的输入C 、算法本身的函数D 、设计者的学术水平3. 以下描述是有关算法设计的基本步骤: ①问题的陈述②算法分析③模型的拟制④算法的实现⑤算法的详细设计 ⑥文档的编制,应与其它环节交织在一起 其中正确的顺序是( )。
A 、①②③④⑤⑥ B 、①③⑤②④⑥C 、②④①③⑤⑥D 、⑥①③⑤②④4.对于含n 个元素的子集树问题,最坏情况下解空间的叶结点数目为( )。
A 、n!B 、2^nC 、2n+1-1D 、1!/!ni n i =∑5. 对于给定的问题,考虑算法复杂性的意义在于( )。
A 、设计出复杂性尽可能低的算法B 、若该问题已有多种算法时,选择其中复杂性低的求解问题C 、提高算法设计的学术水平层次D 、判断算法的正确性6.符号Ω在算法复杂度描述中表示( )。
A 、紧渐近上界 B 、渐近上界C 、紧渐近下界D 、渐近下界7. 设()f n 、()g n 是定义在正数集上的正函数,如果存在正的常数C 和自然数0n ,使得当0n n ≥时有()()f n Cg n ≤,则称函数()f n 当n 充分大时有上界()g n ,记作()(())f n O g n =,即()f n 的阶( )()g n 的阶。
A 、不高于B 、不低于C 、等价于D 、逼近8. 回溯法在解空间树T 上的搜索方式是( )。
A 、深度优先 B 、广度优先C 、最小耗费优先D 、活结点优先9. 下面关于动态规划和备忘录方法的叙述中正确的是( )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
· 终止:当i大于length[A],即i=length[A]+1时,外 层for循环结束。在外循环不变式中,用length[A]+1 代替i,可得子数组A[1..Length[A]]。由循环不变式 得,子数组有序,而这个子数组就是整个数组。因此, 整个数组有序,这表明冒泡排序算法是正确的。
算法分析(p4)
1.2.2最坏情况和平均情况分析(P6)
在冒泡排序算法中,我们分析了算法最佳情况和 最坏情况下的性能。在本书的后续章节中,主要考虑 算法最坏情况下的运行时间,即对于规模n的任何输入, 算法运行最长的时间。之所以这样,是由于以下三个 原因: 算法的最坏情况运行时间是任一输入运行时间的 上界。由此可知,算法的运行时间不会比这更长。我 们无需对算法的运行时间做出有根据的推测,并希望 它不会变得更坏。
算法分析是指对一个算法所需的计算资源进行预 测。
最重要的计算资源是时间和空间资源(存储器) 输入规模的概念取决于所研究的问题。对于许多问 题,如查找、排序问题,最自然的度量是输入元素的个 数,即待排序数组的大小n。而对另外一些问题,如两 个整数相乘,输入规模的最佳度量是用二进制表示的输 入的总位数。有时,用两个数表示输入更合适。例如, 某个算法的输入是一个图,则可用图中顶点数和边数表 示输入。在以下研究的每个问题中,我们都将明确所用 输入规模的度量标准。 一个算法的运行时间是指在某个输入时,算法执行 基本操作的次数或者步数。
找最大值与最小值 在含有N个不同元素的集合中同时找出它的最大 值和最小值(maximum&minimum)的最简单方法是将元 素逐个进行比较。算法中用max和min分别表示最大 值和最小值。算法描述如下: 如果数组中元素按照递增的次序排列,则找出 最大值和最小值所需的元素比较次数为N一1,这是 最佳的情况。如果数组中元素按照递减的次序排列, 则找出最大值和最小值所需的元素比较次数为2(n1),这是最坏情况。在平均情况下,A中将有一半元 素使得第3行的比较为真,找出最大值和最小值所需 的元素比较次数为3(n-1)/2。
我们将利用MERGE作为排序算法的子过程,利用 MERGE· SORT对子数组A[p..r]中的元素进行排序。如 果p≥r,则子数组至多有一个元素,因而有序;否则 第2行计算下标q,将数组A[p..r]划分成两个子数组 A [p..q]和A[q+1..r],它们分别包含
4.归并排序算法的复杂度分析
该递归方程仍然符合主定理的第一种情形, 其解为
两个n位整数相乘(integer multiplication) 的标准算法所需计算时间为 算法是此 的自然,以至于我们可能会觉得没有更好的算法 了。在这里,我们却要通过分治策略向大家展示 一种确实存在的更好的算法。 采用分治法,将x和y都分成两部分:
· 维持:假定在内循环的某次迭代之前循环不变式为 真,即A[j]是A[j..Length[A]]中的最小元素。在下一 次迭代之前,若元素A[j]<A[j-1],则执行第4行语句, A[j]与A[j-1]交换,于是A[j-1]是A[j-1..Length[A]] 中的最小元素;若A[j]≥A[j-1],那么第4行语句不执 行,A[j-1]仍然是A[J-1..1ength[A]]中的最小元素。 无论哪一种情况,都能使循环不变式为真。 · 终止:对于冒泡排序,当j小于i+1,即J=i时,内 层for循环结束。在内循环不变式中,用i代替J,可得 子数组A[i..1ength[A]],其中A[i]是最小元素。
1.归并算法及其运行时间 归并排序的关键操作是归并两个已排序的子序列 的过程。用过程MERGE(A,p,q,r)表示归并两个有序序 列A[p..q]和A[q+1..r]。当过程MERGE(A,p,q,r)执行 完成后A[p..r]中包含的元素有序。过程 MERGE(A,p,q,r)描述如下:
3.归并排序算法
算法
算法(algorithm)可以被定义为一个良定的计算过程, 它具有一个或者若干输入值,并产生一个或者若干输出值。 人们采用一般术语陈述问题,确定输入/输出关系,而 算法则是描述这种输入/输出关系的特定计算过程。 算法正确性:对每一个输入实例算法都能终止,并给出 正确输出。
算法设计和分析的步骤可概括: (1)问题的陈述。 (2)模型的选择。 (3)算法的设计。 (4)算法的程序实现。 (5)算法分析。
1.1.1
冒泡排序
冒泡排序(bubble sort)属于基于交换思想的排序 方法。它将相邻的两个元素加以比较,若左边元素值大 于右边元素值,则将这两个元素交换;若左边元素值小 于等于右边元素值,则这两个元素位臵不变。右边元素 继续和下一个元素进行比较,重复这个过程,直到比较 到最后一个元素为止。 冒泡排序的伪代码用过程BUBBLE-SORT表示,其 参数为包含n个待排序数的数组A[1..n]。当过程 BUBBLE-SORT结束时,数组A中包含已排序的序列。
1.3.2渐近表示(P8)
• 定义1.1如果存在三个正常数
第2章 分 治 法
• 递归(recursion)是数学与计算机科学中的基本概 念。程序设计语言中的递归程序可被简单地定义为 对自己的调用。递归程序必须有终止条件。 • 例2.1 斐波那契(Fibonacci)序列。
例2.2欧几里得(Euclid)算法。 欧几里得算法是两千年来最著名的算法之一:已 知两个非负整数m,n,且m>n>O,求这两个数的最大公 因子。 欧几里得得出本算法基于这样一种观察,两个整 数m和n的最大公因子等于n与m mod n的公因子。欧几 里得算法如下:
循环不变式具有以下三个性质: .初始(initialization):在循环的第一次迭代 之前,循环不变式为真。 .维持(maintenance):如果在循环的某次迭代之 前循环不变式为真,那么在下一次迭代之前,循环不变 式仍然为真。 .终止(termination):当循环终止时,循环不变 式给出有用性质,这个性质可以用于证明算法的正确性 循环不变式和冒泡排序算法的正确性
如果子矩阵的规模大于2,则可以继续划分这些子 矩阵,直至每个矩阵变成2 X 2的矩阵。对于2 X 2的矩 阵的计算,只需8次乘法和4次减法,计算时间为0(1)。 设T(n)表示两个n×n矩阵相乘所需的计算时间,则 由Cij(C=1,2)的计算可以看出,可将T(n)的计算转化为
计算8个
的矩阵相乘和4个
矩阵相
加,而计算
矩阵加法所需时间为O(n2),可得
该递归方程符合主定理的第一种情形,其解 为T(n)=O(nlb8)=O(n3)。因此,直接的分治策略 并没有降低算法的计算复杂度。1969年, Strassen经过对问题的分析,在分治策略的基础 上,通过数学技巧,使算法的计算复杂度从O(n3) 降到了O(n2.81)。当此结果第一次发表时,震动 了数学界。在Strassen矩阵相乘(Strassen matrtrix multiplication)算法中,只用了7 个 的矩阵相乘,但增加了1 0个矩阵加、减法运算。 这7个矩阵乘法是:
算法具有以下五大特性
(1)确定性。一个算法中给出的每一个计算步 骤,必须是精确的定义、无二义性的。 (2)有穷性。一个算法在执行有穷个计算步骤 后必须停止。 (3)可行性。算法中要执行的每一个计算步骤 都是可以在有限时间内做完的。可行性、有穷性和 确定性是相容的。 (4)输入。一个算法一般都要求一个或多个输 入信息。 (5)输出。一个算法一般有一个或多个输入信 息。它们通常可以被解释成为“对输入的计算结 果”。
可表示为如下的式子:
归并排序
归并排序(merge sorting)是分治法应用的另一个 实例,由以下三步组成: (1)划分:将待排序孢个元素的序列划分成两令规 模为n/2的子序列。 (2)解决:用归并排序递归地对每一子序列排序。 (3)合并:归并两个有序序列,得到排序结果。 当划分的子序列规模为1时,递归结束。因为一个 元素的序列被认为是有序的。
对于某些算法,最坏情况经常出现。例如,在数 据库中搜索某个信息时,若搜索的信息不在数据库中, 搜索算法就会出现最坏情况。在某些搜索应用中,搜 索不存在的信息是经常有的。 算法的“平均情况”生能常常与最坏情况大致相 同。上述冒泡排序算法的平均情况与最坏情况具有相 同数量级。
在某些情况下,我们感兴趣的是算法的平均情况 (average-case)或期望运行时间。当进行平均情况分 析时,出现的问题是什么构成这个问题的平均输入。通 常,我们假设已知规模的所有输入出现机率相等,实际 中,可能会违背这个假定。有时,对于进行随机选择的 随机算法,需进行概率分析。
在循环迭代开始时,子数组为输入原数组,循环不 变式为真。在随后的各循环迭代步中,下一迭代步中是当 前子数组中去掉不含秒的那半部分数组后所剩余的部分, 如果v在原数组中,则v必在下一迭代步中将要查找的子数 组中,因此,在每一循环步中,不变式总为真。 在每次迭代中,当A[mid]=v时,将返回下标mid;否则, 子数组长度将减少一半多。因为原数组有有限个元素,循 环必定在有限步内终止。因而,若算法终止于while循环 (第4行),则返回下标mid,循环不变式为真。若算法在第8 行终止,则返回NULL。即待查找的元素不在原数组中。
二叉查找算法 二叉查找(binary search)算法的基本思想是 将n个元素分成大致相等的两部分,取A(Ln/2 )与v 进行比较,如果相等,则找到v,返回所在位臵,算法终 止。 如果v<A(Ln/2 ),则在数组的左半部分继续查 找v。 如果v>A(Ln/2 ),则在数组的右半部分继续查 找v。 当所查找的区间为0时,表示v不在数组中,返回查 找不成功标志0。