算法設(shè)計(jì)與分析課后習(xí)題_第1頁(yè)
算法設(shè)計(jì)與分析課后習(xí)題_第2頁(yè)
算法設(shè)計(jì)與分析課后習(xí)題_第3頁(yè)
算法設(shè)計(jì)與分析課后習(xí)題_第4頁(yè)
算法設(shè)計(jì)與分析課后習(xí)題_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.第一章1. 算法分析題算法分析題11 求下列函數(shù)的漸進(jìn)表達(dá)式(1). 3n2 + 10n 5是,n2 = 1時(shí),n2/10 2 n故: n2/10 + 2n 2 n + 2n = 2*2n = O(2n)(3). 21 + 1/n 21 + 1 = 22 = O(1)(4). log(n3)=3log(n)=O(log(n)(5). 10log(3n) = (10log3)n = O(n)算法分析題1-6(1) 因?yàn)椋篺(n)=log(n2) = 2log(n); g(n) = log(n) + 5所以:f(n)=(log(n)+5) =(g(n)(2) 因?yàn)椋簂og(n) n ; f(n)

2、 = 2log(n); g(n)= n 所以:f(n) = O(g(n)(3) 因?yàn)椋簂og(n) n; f(n) = n; g(n) = log(n2) = 2log(n)所以;f(n) = (g(n)(4) 因?yàn)椋篺(n) = nlogn +n; g(n) = logn所以:f(n) =(g(n)(5) 因?yàn)? f(n) = 10; g(n) = log(10)所以:f(n) =(g(n)(6) 因?yàn)? f(n)=log2(n); g(n) = log(n)所以: f(n) =(g(n)(7) 因?yàn)? f(n) = 2n n 2所以: f(n) = (g(n)(8) 因?yàn)椋篺(n) = 2

3、n; g(n) = 3 n; 2 n 3 n所以: f(n) = O(g(n)習(xí)題19 證明:如果一個(gè)算法在平均情況下的計(jì)算時(shí)間復(fù)雜性為(f(n),該算法在最壞情況下所需的計(jì)算時(shí)間為(f(n).分析與解答:因此,Tmax(N) = (Tavg(N) = (f(n)=(f(n).第二章算法分析題2-3 設(shè)a0:n-1是已經(jīng)排好序的數(shù)組。請(qǐng)改寫二分搜索算法,似的當(dāng)搜索元素x在數(shù)組中時(shí),返回小于x的最大元素位置i和大于x的最小元素位置j。當(dāng)搜索元素在數(shù)組中時(shí),i和j相同,均為x的位置。分許與解答:改寫二分搜索算法如下:typedef int TYPE_t;/* * Function name: Bi

4、narySearch * Parameters: * iIndex 代表i的位置,即最大元素位置; * jIndex代表j的位置,即最小元素位置; * aArr: 代表數(shù)組a,且有序 * xVar:代表元素x; * aLen: 代表數(shù)組元素個(gè)數(shù); * Return value: * 0: 執(zhí)行成功,最大元素位置和最小元素位置不等 * 1: 執(zhí)行成功,最大元素位置和最小元素位置相等 */static int BinarySearch(TYPE_t aArr, int nLen, TYPE_t xVar, int *iIndex, int *jIndex) int left = 0; int ri

5、ght = nLen - 1; int middle = (left + right) / 2; while (left aArrmiddle) left = middle + 1; else right = middle - 1; middle = (left + right) / 2; *iIndex = right; *jIndex = left; return 0;算法分析題2 6 對(duì)任何非零偶數(shù)n,總可以找到奇數(shù)m和正整數(shù)k,使得n = m * 2k.為了求出2個(gè)n階矩陣的乘積,可以把一個(gè)n階矩陣劃分成mm個(gè)子矩陣,每個(gè)子矩陣2k2k個(gè)元素。當(dāng)需要求2k2k的子矩陣的積時(shí),使用Str

6、assen算法。設(shè)計(jì)一個(gè)傳統(tǒng)方法與Strasssen算法相結(jié)合的矩陣相乘算法,對(duì)于任何偶數(shù)n,都可以求出2個(gè)n階矩陣的乘積。并分析算法的計(jì)算時(shí)間復(fù)雜度。分析與解答:將n階矩陣分塊為mm的矩陣。用傳統(tǒng)方法求2個(gè)m階矩陣的乘積需要計(jì)算O(m3)次2個(gè)2k2k矩陣的乘積。用Strassen矩陣乘法計(jì)算2個(gè)2k2k的矩陣的乘積需要的計(jì)算時(shí)間為O(7k), 因此算法的計(jì)算時(shí)間為O(7k*m3).算法分析題2 - 9 設(shè)T0, n-1是n個(gè)元素的數(shù)組。對(duì)任一元素x,設(shè)S(x) = i | Ti = x . 當(dāng)|S(x) | n/2時(shí),稱x為T的主元素。設(shè)計(jì)一個(gè)線性時(shí)間算法,確定T0:n-1是否有一個(gè)主元素

7、。 分析與解答:如果T有一個(gè)主元素x,則x是T的中位數(shù)。反之,如果T的中位數(shù)不是T的主元素,則T沒(méi)有主元素。下面算法設(shè)計(jì)為在一個(gè)線性時(shí)間中找中位數(shù):typedef int T;#define YES_MIDDLE_ELEMENT 1#define NO_MIDDLE_ELEMENT 0/* * Function name: * IsExistMiddleElement * Parameters: * aArr: 表示數(shù)組T0:n-1 * n: 表示數(shù)組長(zhǎng)度 * x: 表示要判斷的數(shù)x,是否主元素 * *keyIndex: 表示主元素在數(shù)組中的下標(biāo) * * Return: * YES_MIDDL

8、E_ELEMENT: 表示找到 * NO_MIDDLE_ELEMENT: 表示沒(méi)有找到 */static int IsExistMiddleElement(T aArr, int n, T x, int *keyIndex) int middleKey = n / 2; int i = 0; for (i = 0; i middleKey) *keyIndex = i; return YES_MIDDLE_ELEMENT; *keyIndex = -1; return NO_MIDDLE_ELEMENT;算法分析題2-14 對(duì)所給元素存儲(chǔ)于數(shù)組中和存儲(chǔ)于鏈表中2中情形,寫出自然合并排序算法。分

9、析與解答:自然合并排序是合并排序算法的一種改進(jìn)。自然合并排序,對(duì)于初始給定的數(shù)組,通常存在多個(gè)長(zhǎng)度大于1的已自然排好序的子數(shù)組段。例如,若數(shù)組a中元素為4,8,7,1,5,6,2,則自然排好序的子數(shù)組段有4,8, 3, 7, 1,5,6, 2.用一次對(duì)數(shù)組a的線性掃描就足以找出所有這些排好序的子數(shù)組段。然后將相鄰的排好序的子數(shù)組段兩兩合并,構(gòu)成更大的排好序的子數(shù)組段3,4,7,8, 1, 2,5,6.繼續(xù)合并相鄰排好序的子數(shù)組段,直至整個(gè)數(shù)組已經(jīng)排好序。算法設(shè)計(jì)及代碼實(shí)現(xiàn):(1). 數(shù)組實(shí)現(xiàn)法:#define DEBUG 1typedef int type_t;static void Data

10、setMerge(type_t *arr, int left, int between, int right) int i, k; int begin1, end1, begin2, end2; type_t *tmpArr; begin1 = left; /*第一個(gè)排好序的初始位置*/ end1 = between; /*第一個(gè)排好序的結(jié)束位置*/ begin2 = between + 1; /*第二個(gè)排好序的初始位置*/ end2 = right; /*第二個(gè)排好序的結(jié)束位置*/ tmpArr = malloc(sizeof(type_t) * (right - left + 1); if

11、 (!tmpArr) return; k = 0; /* * 比較兩個(gè)指針指向的元素,選擇相對(duì)小的元素放入合并空間 * 并移動(dòng)指針到下一個(gè)位置 */ while (begin1 = end1) & (begin2 = end2) if (arrbegin1 arrbegin2) tmpArrk = arrbegin1; begin1+; else tmpArrk = arrbegin2; begin2+; k+; /* 如果第一個(gè)序列有剩余,直接拷貝到合并數(shù)組的序列中 */ while (begin1 = end1) tmpArrk+ = arrbegin1+; /* *如果第二個(gè)序列有剩余,

12、直接拷貝到合并數(shù)組的序列中 */ while(begin2 = end2) tmpArrk+ = arrbegin2+; /* *拷貝臨時(shí)數(shù)組序列到原數(shù)組中 */ for (i = 0; i = (right - left); i+) arrleft + i = tmpArri; free(tmpArr); void DatasetNatureMerge(type_t arr, int n) int *tmpArr; int i, k = 0; int s = 1; int group; /*記錄分割組的數(shù)目*/ int count = 0; int left, between, right;

13、 int arrLen = n; /* *tmpArr 用來(lái)存儲(chǔ)數(shù)組元素下標(biāo)分割點(diǎn) */ tmpArr = (int*)malloc(n * sizeof(int); if (!tmpArr) return; memset(tmpArr, -1, (n * sizeof(int); /* * 存儲(chǔ)首分割點(diǎn) */ tmpArrk+ = 0; for (i = 0; i arri+1) tmpArrk = i; k+; /* * 存儲(chǔ)尾分割點(diǎn) */ tmpArrk = n - 1; /* * k 和 group 分別記錄分割數(shù)組長(zhǎng)度 */ group = k;#if DEBUG printf(n數(shù)

14、組分割點(diǎn)為:n); printf(t); for (i = 0; i k) right = k; DatasetMerge(arr, tmpArrleft, tmpArrbetween, tmpArrright); /* * 進(jìn)行生下來(lái)的合并 */ for (i = 1; i k) right = k; DatasetMerge(arr, tmpArrleft + 1, tmpArrbetween, tmpArrright); s += s; free(tmpArr);(2). 鏈表實(shí)現(xiàn)法:#if LINKtypedef struct node *link_t;struct node int

15、item; link_t next;link_t LinkMerge(link_t a, link_t b) link_t c, head; c = head = malloc(sizeof(struct node); while (a != NULL) & (b != NULL) if (a-item item) c-next = a; c = a; a = a-next; else c-next = b; c = b; b = b-next; c-next = (a = NULL) ? b : a; return head-next;link_t LinkNuturalMergesort(link_t t) link_t a, b; link_t u, v; QUEUE Q; if (t = NULL | t-next = NULL) return t

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論