![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法导论课后习题
风海铜锣
个人公众号:风海铜锣
展开
-
算法导论4.1-5 最大子数组问题的线性复杂度解
题目使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1..j]的最大子数组,基于如下性质将解扩展为A[1..j+1]的最大子数组:A[1..j+1]的最大子数组要么是A[1..j]的最大子数组,要么是某个子数组A[i..j+1](1≤i≤j+1)。在已知A[1..j]的最大子数组的情况下,可以在线性时间内找出形如A[i..j+1]的最大子数组。答题用C++语言编写的代码如下:struct Sub {原创 2021-09-12 21:41:34 · 297 阅读 · 0 评论 -
算法导论4.1-3 最大子数组问题暴力与递归
题目在你的计算机上实现最大子数组问题的暴力解法和递归算法。请指出多大的问题规模n0是性能交叉点 – 从此之后递归算法将击败暴力算法?然后,修改递归算法的基本情况 – 当问题规模小于n0时采用暴力算法。修改后,性能交叉点会改变吗?题解我用的是C语言来测试该问题,在我机器上测试的结果是n0等于20的时候起,递归算法将击败暴力算法。代码如下:#include <cstdio>#include <cstring>#include <climits>#include原创 2021-09-07 22:42:56 · 812 阅读 · 0 评论 -
算法导论4.1-2 最大子数组问题的暴力解
题目对最大子数组问题,编写暴力求解方法的伪代码,其运行时间应该是θ(n^2)。题解θ(n^2)的方法是通过保存二维数组的上一个计算结果,即i..j的和,来计算i..j+1的和。用c++代码写一遍。#include <cstdio>#include <cstring>#include <climits>struct Sub { int low; int high; int sum;};Sub FindMaximumSubarr原创 2021-08-27 09:50:30 · 425 阅读 · 0 评论 -
算法导论4.1-1 最大子数组问题
4.1-1 当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回什么?答:当数组所有元素均为负数,那么最大子数组的只能是数组中值最大的单个元素。原创 2021-08-26 23:37:50 · 231 阅读 · 0 评论 -
算法导论 3-6 多重函数
题目(多重函数)我们可以把用于函数 lg* 中的重复操作符 * 应用于实数集上的任意单调递增函数 f(n) 。对给定的常量 c∈R ,我们定义多重函数 f*c 为:f*c(n) = min { i >= 0: f^(i)(n) <= c }该函数不必在所有情况下都为良定义的。换句话说,值 f*c(n) 是为缩小其参数到c或更小所需要函数f重复应用的数目。对如下每个函数 f(n) 和常量 c ,给出 f*c(n) 的一个尽量紧确的界。f(n)cf*c(n)a.原创 2021-08-22 22:52:46 · 527 阅读 · 0 评论 -
算法导论 3-5 O与Ω的一些变形
(O与Ω的一些变形)某些作者用一种与我们稍微不同的方式来定义Ω;假设我们使用(读作“Ω无穷”)来表示这种可选的定义。若存在正常量c,使得对无穷个整数n,有,则称。a. 证明:对渐近非负的任意两个函数f(n)和g(n),或者f(n)=O(g(n))或者或者二者均成立,然而,如果使用Ω来替代,那么该命题并不为真。b. 描述用代替Ω来刻画程序运行时间的潜在优点和缺点。 某些作者也用一种稍微不同的方式来定义O;假设使用O'来表示这种可选的定义。我们称f(n)=O'(g(n))当且仅当...原创 2021-08-22 12:18:50 · 271 阅读 · 0 评论 -
算法导论 3-4 证明与反驳
(渐进记号的性质)假设f(n)和g(n)为渐近正函数。证明或反驳下面的每个猜测。a. f(n)=O(g(n))蕴含g(n)=O(f(n))。b. f(n)+g(n)=θ(min(f(n), g(n))。c. f(n)=O(g(n))蕴含lg(f(n))=O(lg(g(n))),其中对所有足够大的n,有且。...原创 2021-01-05 20:19:17 · 1437 阅读 · 0 评论 -
算法导论 3-3 根据渐近增长率排序
(根据渐近增长率排序)a. 根据增长的阶来排序下面的函数,即求出满足,原创 2020-12-28 13:35:23 · 3128 阅读 · 0 评论 -
算法导论 3-2 渐近比较
(相对渐近增长)为下表中的每对表达式(A, B)指出A是否是B的O,o,Ω,ω或θ。假设、且均为常量。回答应该以表格的形式,将“是”或“否”写在每个空格中。A B ...原创 2020-12-11 10:14:14 · 1003 阅读 · 1 评论 -
算法导论 3-1 麻烦的多项式渐近
(多项式的渐近行为)假设是一个关于n的d次多项式,其中,k是一个常量。使用渐近记号的定义来证明下面的性质。a. 若,则。b. 若,则。c. 若,则。d. 若,则。e. 若,则。解答:a. 根据的形式化定义,有:{存在正常量和,使得对所有,有}。套用到问题a中,则且。我们取b等于中的最大绝对值,当时,,由于,并且b是中的最大绝对值,所以对于中的每一个均不小于中的任何一个...原创 2020-12-10 16:12:40 · 897 阅读 · 0 评论 -
算法导论 3.2-8 lnn的证明
证明:klnk=θ(n)蕴含着k=θ(n/lnn) 。解答:由klnk=θ(n)可得klnk=an+b,由此推出由于等式右侧也有k,进一步的可得由于an+b渐近大于lnk,所以可以简化为θ(n)/θ(lnn)=θ(n/lnn)。本题得证。原创 2020-12-06 13:44:04 · 786 阅读 · 0 评论 -
算法导论 3.2-7 共轭数
用归纳法证明:第i个斐波那契数满足等式其中是黄金分割率且是其共轭数。解答:根据归纳法,当i=1时,对于,其中,可得,所以当i=1时命题成立。当i=2时,有假设已知当i=n时命题成立,所以有,那么当i=n+1时,可得...原创 2020-12-04 23:29:45 · 690 阅读 · 0 评论 -
算法导论 3.2-6 黄金分割率
证明:黄金分割率及其共轭数都满足方程式。解答:,可得满足方程式,可得满足方程式原创 2020-12-03 18:51:50 · 504 阅读 · 0 评论 -
算法导论 3.2-5 多重对数函数
如下两个函数中,哪一个渐近更大一些:还是?解答:因为是的对数函数,而,可以知道是的多项式函数。由于对数函数渐近始终小于多项式函数的渐近。所以的渐近更大。原创 2020-12-02 17:19:57 · 628 阅读 · 0 评论 -
算法导论 3.2-4 多项式问题
函数⦍lgn⦐!多项式有界吗?函数⦍lglgn⦐!多项式有界吗?解答:原创 2020-12-02 16:44:39 · 712 阅读 · 0 评论 -
算法导论 3.2-3 证明题
证明等式(3.19)。并证明且。解答:等式(3.19):=θ()θ(g(n))表示以下函数的集合:θ(g(n))={ f(n): 存在正常量、和,使得对所有,有 }原创 2020-11-24 11:48:13 · 1072 阅读 · 0 评论 -
算法导论 3.2-2 证明等式3.16
证明等式(3.16) 。解答:等式3.16的证明可描述为:证明对所有实数a>0,b>0,c>0,有。我们对取a的对数,可得原创 2020-11-13 10:36:56 · 255 阅读 · 0 评论 -
算法导论 3.2-1 关于单调递增函数的证明
证明:若f(n)和g(n)是单调递增的函数,则函数f(n)+g(n)和f(g(n))也是单调递增的,此外,若f(n)和g(n)是非负的,则f(n)·g(n)是单调递增的。解答:证明1:若f(n)和g(n)是单调递增的函数,则函数f(n)+g(n)也是单调递增的。若,因为f(n)和g(n)是单调递增的函数,可得且,我们将两个不等式左右相加,可得。该证明成立。证明2:若f(n)和g(n)是单调递增的函数,则函数f(g(n))也是单调递增的。...原创 2020-11-06 11:46:48 · 4766 阅读 · 0 评论 -
算法导论 3.1-8 记号扩展
可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m),用O(g(n, m))来表示以下函数集:O(g(n, m)) = { f(n, m): 存在正常量c、和,使得对所有或,有}对Ω(g(n, m))和θ(g(n, m))给出相应的定义。解题:Ω(g(n, m)) = { f(n, m): 存在正常量c、和,使得对所有或,有}θ(g(n, m)) = { f(n, m): 存在正常量、、和,使得对所有或,有...原创 2020-11-04 12:20:30 · 212 阅读 · 0 评论 -
算法导论 3.1-7 证明题
证明:为空集。解题:根据o和w函数的形式化定义:o(g(n)) = { f(n): 对任意正常量c > 0,存在常量,使得对所有,有}w(g(n)) = { f(n): 对任意正常量c > 0,存在常量,使得对所有,有}我们取o(g(n))和w(g(n))的交集,那么该交集可以定义如下:= { f(n):对任意正常量和,存在常量,使得对所有,有}由于...原创 2020-11-04 11:47:50 · 492 阅读 · 0 评论 -
算法导论 3.1-6 θ、Ω和O的又一个证明题
证明:一个算法的运行时间为θ(g(n))当且仅当其最坏情况运行时间为O(g(n)),且其最好情况运行时间为Ω(g(n)) 。解题:分两步进行证明:1. 如果一个算法的运行时间为θ(g(n)),那么可得它的最坏情况运行时间为O(g(n)),且其最好情况运行时间为Ω(g(n)) 。2. 如果一个算法它的最坏情况运行时间为O(g(n)),且其最好情况运行时间为Ω(g(n)),那么可得该算法的运行时间为θ(g(n)) 。证明1.如果一个算法的运行时间为θ(g(n)),那么可形式化描述为:原创 2020-11-02 22:43:39 · 893 阅读 · 0 评论 -
算法导论 3.1-5 证明定理3.1
证明定理3.1解答:定理3.1 对任意两个函数f(n)和g(n),我们有f(n)=θ(g(n)),当且仅当f(n)=O(g(n))且f(n)=Ω(g(n)) 。原创 2020-10-31 16:37:47 · 2167 阅读 · 0 评论 -
算法导论 3.1-4 证明题
= O()成立吗?=O()成立吗?解答:O的形式化定义如下:O(g(n)) = { f(n): 存在正常量和c,使得对所有n,有0f(n)cg(n)} 。一、= O()成立吗?要证明= O(),我们把它们代入O的形式化定义中,即O() = { : 存在正常量和c,使得对所有n,有0c} 。由于等价于*2 ,那么我们只要取c=2,=0,即可证明该等式。二、=O()成立吗?要证明= O(),我们把它们代入O的形式化定义中,即O() = { : 存在正常量和c...原创 2020-10-31 13:58:37 · 495 阅读 · 0 评论 -
算法导论 3.1-3 一个解释
解释为什么“算法A的运行时间至少是O()”是无意义的。解答:回答这道题我们可以回到O的定义中。O的形式化定义如下:O(g(n)) = { f(n): 存在正常量和c,使得对所有n,有0f(n)cg(n)} 。当我们说“算法A的运行时间至少是O()”时,如果把算法的运行时间用T(n)表示,那么我们等于在说,T(n)O() 。我们试举算法T(n) = 0 。即使T(n) = 0,我们说它的运行时间至少是O() 也依然是正确的,也就是说不管算法T(n) = 0,还是T(n) = n,或者任何.原创 2020-10-30 12:57:27 · 377 阅读 · 0 评论 -
算法导论 3.1-2 又一道θ的证明题
证明:对任意实常量a和b,其中b>0,有= θ() 。以下解答。根据θ的形式化定义,该问题可以表述为求证如下定义:θ() = {:存在正常量、和,使得对所有n,有0} 。原创 2020-10-28 17:00:54 · 1604 阅读 · 2 评论 -
算法导论 3.1-1 关于θ记号
假设f(n)和g(n)都是渐近非负函数。使用θ记号的基本定义来证明max(f(n), g(n)) = θ(f(n)+g(n))。要解决这个问题,我们先来回顾一下θ函数的形式化定义:θ(g(n)) = {f(n): 存在正常量、和,使得对所有n,有0f(n)g(n)}...原创 2020-10-15 14:53:56 · 1678 阅读 · 0 评论 -
算法导论 2-4 逆序对
(逆序对)假设A[1..n]是一个有n个不同数的数组。若i<j且A[i]<A[j],则对偶(i, j)原创 2020-10-09 17:06:30 · 1089 阅读 · 1 评论 -
算法导论 2-3 霍纳(Horner)规则的正确性
(霍纳(Horner)规则的正确性)给定系数,,... ,和x的值,代码片段实现了用于求值多项式的霍纳规则。a. 借助θ记号,实现霍纳规则的以上代码片段的运行时间是多少?b. 编写伪代码来实现朴素的多项式求值算法,该算法从头开始计算多项式的每个项。该算法的运行时间是多少?与霍纳规则相比,其性能如何?c. 考虑以下循环不变式: 在第2~3行for循环每次迭代的开始有 把没有项的和式解释为等于0。遵照本章中给出的循环不变式证明的结构,使用该循环不变式来证明终止时有...原创 2020-09-25 14:38:50 · 1314 阅读 · 0 评论 -
算法导论 2.3-1 归并排序数据操作示例
使用图2-4作为模型,说明归并排序在数组A=<3, 41, 52, 26, 38, 57, 9, 49>上的操作。原创 2020-09-03 15:09:45 · 329 阅读 · 0 评论 -
算法导论 2-2 冒泡排序的正确性
(冒泡排序的正确性)冒泡排序是一种流行但低效的排序算法,它的作用是反复交换相邻的未按次序排列的元素。a. 假设A' 表示BUBBLESORT(A)的输出。为了证明BUBBLESORT正确,我们必须证明它将终止并且有: (2.3)其中 n = A.length 。为了证明 BUBBLESORT 确实完成了排序,我们还需要证明什么?下面两部分将证明2.3 。b. 为第 2~4 行的for循环精确地说明一个循环不变式,并证明该循环不变式成立。你的证明应该使用本章中给出的循环不变式证明的..原创 2020-09-20 22:31:05 · 2097 阅读 · 0 评论 -
算法导论 2-1 在归并排序中引入插入排序
(在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ(),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。a. 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表。b. 表明在最坏情原创 2020-09-18 11:08:33 · 980 阅读 · 1 评论 -
算法导论 2.3-7 新的查找问题
描述一个运行时间为θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。该算法伪代码如下:该算法的执行过程如下:首先对数组S进行归并排序 - 或任何运行时间不高于θ(nlgn)的排序。代码 6~10 行执行这样一个循环:算法将已排序的子数组 S[i..j] 中的最小元素 S[i] 和最大元素 S[j] 的和与x进行比较。如果比较结果小于x,由于S[i..j]是已排序的,那么可以推断S[i]与S[i..j]中任何其它元素都小于x,故可原创 2020-09-15 21:26:49 · 463 阅读 · 0 评论 -
算法导论 2.3-6 可否在插入排序中加入二分查找
注意到2.1节中的过程INSERTION-SORT的第5~7行的while循环采用一种线性查找来(反向)扫描已排好序的子数组A[1..j-1]。我们可以使用二分查找(参见练习2.3-5)来把插入排序的最坏情况总运行时间改进到θ(nlgn)吗?答案是不能。我们先来看看INSERTION-SORT的伪代码:第5~7行代码的作用不仅仅是查找key值(即A[j])所应该插入的位置,还包括将查找到的位置索引i所对应的元素全部往后赋值的操作。如果改用二分查找来替代第5~7行代码,那么二分查找i的时间原创 2020-09-13 23:00:37 · 585 阅读 · 0 评论 -
算法导论 2.3-5 数组已排序时的二分查找法分析
回顾查找问题(参见练习 2.1-3),注意到,如果序列A已排好序,就可以将该序列的中点与v进行比较。根据比较的结果,原序列中有一半就可以不用做进一步的考虑了。二分查找算法重复这个过程,每次都将序列剩余部分的规模减半。为二分查找写出迭代或递归的伪代码。证明:二分查找的最坏情况运行时间为θ(lgn)。伪代码如下...原创 2020-09-12 14:02:56 · 424 阅读 · 0 评论 -
算法导论 2.3-4 插入排序的递归表达
我们可以把插入排序表示为如下的一个递归过程。为了排序A[1..n],我们递归地排序A[1..n-1],然后把A[n]插入已排序的数组A[1..n-1]。为插入排序的这个递归版本的最坏情况运行时间写一个递归式。该递归式表达为:n = 1 时 T(n) = θ(1) 。 C为常量时间。n > 1 时 T(n) = T(n-1) +θ(n) 。...原创 2020-09-08 21:37:07 · 682 阅读 · 0 评论 -
算法导论 2.3-3 数学归纳法
使用数学归纳法证明:当n刚好是2的幂时,以下递归式的解是T(n) = nlgn 。解:由于n始终未k的幂次方,我们先求解初始值k=1时命题是否成立,当k=1时,n=2,则有T(n) = 2lg2 = 2,命题成立。接下来,我们将求证假设:前提(代号P):当k > 1时,有n=,T(n) === 成立。求证:如果前提P成立,那么 n =时,有==也成立。我们来一步一步求解(该式子代号Q)的值,该式子等价于:,由于假设前提P的成立,故等价于,我们...原创 2020-09-05 16:56:19 · 975 阅读 · 0 评论 -
算法导论 2.3-2 重写归并排序中的过程MERGE
重写过程MERGE,使之不使用哨兵,而是一旦数组L或R所有元素均被复制回A就立刻停止,然后把另一个数组的剩余部分复制回A。以下为重写后的伪代码。原创 2020-09-03 15:36:33 · 343 阅读 · 0 评论 -
算法导论 2.2-4 如何修改几乎任何算法来使之具有最好运行时间
我们可以如何修改几乎任意算法来使之具有良好的最好情况运行时间?原创 2020-09-01 10:39:14 · 493 阅读 · 1 评论 -
算法导论 2.2-3 再次考虑线性查找问题
再次考虑线性查找问题(参见练习2.1-3)。假定要查找的元素等可能地为数组中的任意元素,平均需要检查输入序列的多少元素?最坏情况又如何呢?用Θ记号给出线性查找的平均情况和最坏情况运行时间。证明你的答案。线性查找伪代码如下:假定要查找的元素等可能的为数组中的任意元素,平均需要检查输入序列的元素个数为:。将该式子进行运算可得。由此可得平均需要检测的输入序列元素个数为。在最坏情况下,要查找的元素应为数组的最后一个元素,这样一来需要查找的元素个数将始终为 n。平均情况下,由于需要检测...原创 2020-08-31 12:31:43 · 750 阅读 · 0 评论 -
算法导论 2.2-2 选择排序算法
考虑排序存储在数组A中的n个数:首先找出A的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素,而不是对所有n个元素进行?用θ记号给出选择排序的最好情况与最坏情况运行时间。伪代码如下:该算法维持的循环不变式是:A[1..j-1] 是已排序元素,且该已排序元素由整个数组最小的j-1个数组成。之所以只需要对前n-1..原创 2020-08-31 12:15:41 · 1005 阅读 · 0 评论