算法导论答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 15 章
15.1-2
15.1-3
2n
n
∑ ∑ ∑ fi[ j] =
ri( j) = 2( 2n− j ) = 2(2n −1) = 2n+1 −1
i=1 j=1
j =1
15.1-4
15.1-5
15.2-1
最终答案:((A1A2)((A3A4)(A5A6))) 15.2-2 15.2-3 15.2-4
16.3-1 16.3-2
16.3-3 16.3-4
16.3-5
16.3-6 那就推广到树的结点有三个孩子结点,证明过程同引理 16.3 的证明。 16.3-7 16.3-8
第 24 章
24.1-1 同源顶点 s 的运行过程,见图 24-4 24.1-2
24.1-3
24.1-4 24.1-5* 24.1-6 修改 Bellman-Ford 算法,先找到负环上的一个节点,再依次找到负环上的一个节点,再依 次找到负环上的其他节点。 24.2-1 见图 24-5 24.2-2 最后一次不影响结果
4.1-5
4.1-6 4.2-1
4.2-2 4.2-3
4.2-4
4.2-5
4.3-1
4.3-2
4.3-3 4.3-4 不能运用主方法 4.3-5
5.1-1 因为本身就是一个排序过程 5Байду номын сангаас2-1
第5章
5.2-2
5.2-3 5.2-4 5.2-5
5.3-1
5.3-2 5.3-3
5.3-4
L[i]=A[p+i-1];
} for(int j=0;j<n2;j++) { R[j]=A[q+j]; } int i=0; int j=0; int k=p-1; while((i<=n1-1)&&(j<=n2-1)) { if(L[i]<=R[j]) { A[k]=L[i];
i++; } else { A[k]=R[j]; j++; } k++; } while(i<=n1-1) { A[k]=L[i]; i++; k++; } while(j<=n2-1) { A[k]=R[j]; j++; k++; } delete[]L; delete []R; } 2.3-3
len=j;//更新 len
} cout<<len<<endl; } return 0; } 15.5-1
15.5-2 15.5-3
15.5-4
16.1-1
第 16 章
16.1-2 16.1-3
16.1-4 16.2-1 16.2-2
16.2-3
16.2-4
16.2-5 16.2-6
16.2-7
cin>>a[i]; b[0]=1; c[0]=-1; c[1]=a[0]; len=1;//此时只有 c[1]求出来,最长递增子序列的长度为 1. for(i=1;i<n;i++) {
j=find(c,len,a[i]); c[j]=a[i]; if(j>len)//要更新 len,另外补充一点:由二分查找可知 j 只可能比 len 大 1
25.3-6
5.3-6
6.1-1 6.1-2 6.1-3 6.1-4 6.1-5 6.1-6
第6章
6.1-7
6.2-1 见图 6-2 6.2-2
6.2-3
6.2-4
6.2-5 对以 i 为根结点的子树上每个点用循环语句实现 6.2-6
6.3-1
见图 6-3 6.3-2
6.3-3
6.4-1 见图 6-4 6.4-2 HEAPSORT 仍然正确,因为每次循环的过程中还是会运行 MAX-HEAP 的过程。 6.4-3
5.3-5
令 m = n3 ,生成的全排列个数有 mn , 其中不重复的有 P(m, n) = m *(m −1) *"*(m − n +1) , 所以,所有元素唯一概率为 P(m, n) / mn 要证 P(m, n) / mn ≥ 1−1/ n 由于 P(m, n) / mn ≥ [(m − n) / m]n 故需证:[(m − n) / m]n ≥ 1−1/ n 易证
6.4-4
6.4-5
6.5-1 据图 6-5 6.5-2
6.5-3 6.5-4 6.5-5
6.5-6 6.5-7
6.5-8
7.1-1 见图 7-1 7.1-2
7.1-3 7.1-4 7.2-1 7.2-2
7.2-3 7.2-4 7.2-5
第七章
7.2-6 7.3-1
7.3-2
7.4-1 7.4-2
第 25 章
25.1-4 25.1-5
25.1-6 25.1-7 25.1-8
25.1-9 25.1-10 25.2-1 见图 25-4 25.2-2 25.2-3 25.2-4
25.2-5 25.2-6
25.2-7 25.2-8
25.2-9 25.3-1 25.3-2 25.3-3
25.3-4 25.3-5
7.4-3 纯数学问题,对式子求导即可得。 7.4-4 见 RANDOMIZED-QUICKSORT.ppt 7.4-5 见快速排序改进算法(7.4-5).pdf 7.4-6
第八章
8.1-1 8.1-2 8.1-3
8.1-4
8.2-1 见图 8-2 8.2-2 和 8.2-3
8.2-4
8.3-1 见图 8-3 8.3-2
2.3-4 2.3-5
2.3-6 2.3-7
第3章
3.1-1 3.1-2
3.1-3 3.1-4
3.1-5 3.1-6 3.1-7 3.1-8
3.2-1
3.2-2
3.2-3
3.2-4
3.2-5 后者大 3.2-6 数学归纳法易证 3.2-7 用数学归纳法证明
第4章
4.1-1
4.1-2
4.1-3 T(n)=cnlgn+n 4.1-4
8.3-3 8.3-4
8.3-5(*) 8.4-1 见图 8-4 8.4-2
8.4-3 3/2,1/2 8.4-4(*) 8.4-5(*)
9.1-1
9.1-2 9.2-1 9.3-1
第九章
9.3-2 9.3-3
9.3-4 9.3-5
9.3-6 9.3-7
9.3-8
9.3-9
15.1-1
24.2-3
24.2-4
24.3-1 见图 24-6 24.3-2
24.3-3
24.3-4 24.3-5 24.3-6
24.3-7
24.3-8 这种情况下不会破坏已经更新的点的距离。 24.4**** 24.5****
25.1-1 见图 25-1 25.1-2 为了保证递归定义式 25.2 的正确性 25.1-3
第2章 第3章 第4章 第5章 第6章 第7章 第8章 第9章 第 15 章 第 16 章 第 24 章 第 25 章
《算法导论》参考答案
第2章
2.1-1
2.1-2
2.1-3 2.1-4
2.2-1 2.2-2
2.2-3
2.2-4
2.3-1
2.3-2 void Merge(int *A,int p,int q,int r) { //构建左半部分和右半部分的辅助数组 int n1=q-p+1; int n2=r-q; int *L=new int[n1]; int *R=new int[n2]; for (int i=0;i<n1;i++) {
15.2-5 用递归
15.3-1
15.3-2 15.3-3
15.3-4
15.3-5 15.4-1
15.4-2 15.4-3
15.4-4
15.4-5
15.4-6 #include <iostream> using namespace std; int find(int *a,int len,int n)//修改后的二分查找,若返回值为 x,则 a[x]>=n {
int left=0,right=len,mid=(left+right)/2; while(left<=right) {
if(n>a[mid]) left=mid+1; else if(n<a[mid]) right=mid-1; else return mid; mid=(left+right)/2; } return left; } int main() { int n,a[100],c[100],i,j,len;//新开一变量 len,用来储存每次循环结束后 c 中已经求出值的元 素的最大下标 while(cin>>n) { for(i=0;i<n;i++)