日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法导论2.3练习答案

發布時間:2024/8/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法导论2.3练习答案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2.3-1使用圖2-4作為模型,說明歸并排序在數組A=<3,41,52,26,38,57,9,49>上的操作。


2.3-2重寫過程MERGE,使之不使用哨兵,而是一旦數組L或R的所有元素均被復制回A就立即停止,然后把另一個數組的剩余部分復制回A。


使用哨兵的歸并排序(MERGE-SORT)見文章:C語言實現歸并排序
無哨兵版:

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h>void merge(int A[], int p, int q, int r) {int n1 = q - p + 1;int n2 = r - q;int* L = (int*)calloc(n1, sizeof(int));int* R = (int*)calloc(n2, sizeof(int));int i, j;//A[p..q]復制到Lfor (i = 0; i < n1; i++)L[i] = A[p + i];//A[q+1..r]復制到Rfor (j = 0; j < n2; j++)R[j] = A[q + j+ 1];i = j = 0;for (int k = p; k <= r; k++) {//L中的元素復制完畢,只需繼續復制R中的if (i >= n1) {A[k] = R[j];j++;}//R中的元素復制完畢,只需繼續復制L中的else if (j >= n2) {A[k] = L[i];i++;}//從L、R數組中取更小的元素插入A數組else if (L[i] <= R[j]) {A[k] = L[i];i++;}else {A[k] = R[j];j++;}}free(L);free(R); }void mergeSort(int A[], int p, int r) {//若不滿足下面的if條件,則跳出當前遞歸返回上一層if (p < r) {int q = (int)floor(((double)p + r) / 2.0);mergeSort(A, p, q);mergeSort(A, q + 1, r);merge(A, p, q, r);} }main(){//測試int A[] = { 5,2,4,7,1,3,2,6 };mergeSort(A, 0, 7);for (int i = 0; i < 8; i++)printf("%d ", A[i]); }

2.3-3使用數學歸納法證明:當n剛好是2的冪時,以下遞歸式的解是T(n)=nlgn

T(n)={2,n=22T(n/2)+n,n=2k(k>1)T(n) = \begin{cases} 2 &\text{},n=2\\ 2T(n/2)+n &\text{},n=2^k(k>1) \end{cases} T(n)={22T(n/2)+n?,n=2,n=2k(k>1)?


(1). n = 21時,T(n) = 2 = 2lg2
(2). 假設 n = 2k時,T(n) = nlgn = 2klg2k = k2k
則對于 n = 2k+1,有
T(n) = 2T(2k+1 / 2) + 2k+1
= 2k?2k + 2k+1
= (k + 1)2k+1
= 2k+1lg2k+1
= nlgn
證畢。

2.3-4我們可以把插入排序表示為如下的一個遞歸過程。為了排序A[1…n],我們遞歸地排序A[1…n-1],然后把A[n]插入已排序的數組A[1…n-1]。為插入排序的這個遞歸版本的最壞情況運行時間寫一個遞歸式。


最壞情況下將A[n]插入到子序列A[1…n-1]需要花費Θ(n)時間。
T(n)={Θ(1),n=1T(n?1)+Θ(n),n>1T(n) = \begin{cases} \Theta(1) &\text{},n=1\\ T(n-1)+\Theta(n) &\text{},n>1 \end{cases} T(n)={Θ(1)T(n?1)+Θ(n)?,n=1,n>1?
時間復雜度為(n-1)Θ(n)+Θ(1)=Θ(n2)

2.3-5回顧查找問題(參見練習2.1-3),注意到如果序列A已排好序,就可以將該序列的中點與v進行比較。根據比較的結果,原序列中就有一半可以不用再做進一步的考慮了。二分查找算法會重復這個過程,每次都將序列剩余的部分規模減半。為二分查找寫出迭代或遞歸的偽代碼。證明:二分查找最壞情況運行時間為θ(lgn)。


偽代碼:
1.迭代版

ITERATIVE-BINARY-SEARCH(A,v)low=1high=A.lehgthwhile low<=highmid=(low+high)/2if v==A[mid]return midelse if v<A[mid]high=mid-1elselow=mid+1return NIL

2.遞歸版

RECURSIVE-BINART-SEARCH(A,v,low,high)if low>highreturn NILmid=(low+high)/2if v==A[mid]return midelse if v<A[mid]return RECURSIVE-BINART-SEARCH(A,v,low,mid-1)elsereturn RECURSIVE-BINART-SEARCH(A,v,mid+1,high)

C語言代碼見文章:C語言實現二分查找,折半查找(迭代/遞歸)
遞歸式
T(n)={Θ(1),n=1T(n/2)+Θ(1),n>1T(n) = \begin{cases} \Theta(1) &\text{},n=1\\ T(n/2)+\Theta(1) &\text{},n>1 \end{cases} T(n)={Θ(1)T(n/2)+Θ(1)?,n=1,n>1?
可自行使用遞歸樹進行分析,設遞歸樹的高度為h,則2h=n,共有(lgn + 1)個 Θ(1)。
所以最壞情況下 T(n) = (lgn + 1)Θ(1) = Θ(lgn)。

2.3-6注意到2.1節中的過程INSERTION-SORT的第5~7行的while循環采用一種線性查找來(反向)掃描已排好序的子數組A[1…j-1]。我們可以使用二分查找(參見練習2.3-5)來把插入排序的最壞情況總運行時間改進到θ(nlgn)嗎?


不可以
算法分析與代碼實現:二分查找插入排序(優化的直接插入排序)
最壞情況下需要對1 + 2 + 3 + … + (n - 1) = n(n - 1)/2個元素后移,需要的賦值操作次數為n(n - 1)/2 + (n - 1),排序的時間復雜度仍為O(n2)。

2.3-7描述一個運行時間為O(nlgn)的算法,給定n個整數的集合S和另一個整數x,該算法能確定S中是否存在兩個其和剛好為x的元素。


首先使用歸并排序對集合S進行排序,這一步的運行時間為O(nlgn),然后對S中任一元素 si 使用二分查找在子序列 S[i+1…n] 中檢索值為 x - si 的元素。這一步的運行時間為 O(lgn)。
綜上,該算法的運行時間為 O(nlgn) + n?O(lgn) = O(nlgn)

總結

以上是生活随笔為你收集整理的算法导论2.3练习答案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。