演算法第二章上機實驗報告

2022-09-01 03:12:09 字數 1089 閱讀 2656

實驗報告

1、實踐題目:pta第二題,改進二分搜尋演算法

2、問題描述:設a[0:n-1]是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。

3、演算法描述:

整體框架:

1)首先,還是和第一題一樣的二分搜尋框架,利用遞迴來實現二分搜尋。

遞迴實現二分搜尋具體步驟:先判斷所找數是否在陣列中,若在就把這個數和該已排序好的陣列的中間數對比,若小於中間數,則下次遞迴區間為最小數和中間數-1,並且重新計算該新區間的中間數,一直遞迴;若大於中間數,則下次遞迴區間為中間值+1和最大值,後面步驟和小於中間值情況一樣。當遞迴到找到所找值則結束遞迴,若找不到則到下面的限制條件。

2)其次,是限制條件,判斷所要搜尋的數在不在陣列中,若不在陣列中,又分三個情況,在陣列的最大和最小值的區間內、比最小的還小、比最大的還大。然後判斷完就分別實現各自需要輸出的東西。該源**中把在區間內和比最大的都大的合併為一種。

3)主函式就正常輸入陣列,按照格式,再呼叫改進後的二分搜尋函式。

4、演算法時間及空間複雜度分析

該源**遞迴的次數和深度都是log2 n,每次所需要的輔助空間都是常數級別,故:

1)時間複雜度:o(log2 n)

2)空間複雜度:o(log2 n)

5、心得體會

這次完成得不是很滿意,一直在第一題卡著,很多人都是用迭代法實現二分搜尋,而我們小組是用遞迴法實現,就涉及統計比較次數的問題,當所找的數不在陣列中時的統計次數總有問題,這裡卡了很久不會改,導致沒多少時間做後面的題。最後在下課前完成了第二題,很開心。這次兩題都涉及了二分搜尋演算法,使我加深了對該演算法的熟悉度,並且無論是第一題還是第二題,都涉及所要找的數是否在陣列內的問題,這就是鍛鍊寫程式的健壯性,能夠讓我多去思考這些邊界問題,包括第二題中所找數不在陣列內也還可以分三種情況,就對乙個問題的再細分化,能夠更加看懂乙個問題,使其更加完善。另外,兩人上機課現場做題,那種一起思考問題,兩人一起**,多些想法,更能完善乙個演算法或者程式,因為人多力量大,每人的思維可能會有差異,兩個思維一起的時候能想到的方面就多了。並且,一人打**,另乙個人看的時候也能看出一些小錯誤就能夠及時修正,不會讓它誤了事。以上。

第二章上機實驗報告

1 實踐題目 兩個有序序列的中位數 2 題目描述 知有兩個等長的非降序序列s1,s2,設計函式求s1與s2並集的中位數。有序序列a 0 a 1 a n 1 的中位數指a n 1 2 的值,即第 n 1 2 個數 a 0 為第1個數 輸入分三行。第一行給出序列的公共長度n 0 100000 隨後每行輸...

演算法第二章實驗報告

7 1 二分查詢 輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出...

第二章實驗報告

實踐題目名稱 找第k小的數 1.問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。輸入格式 輸入有兩行 第一行是n和k,0第二行是n個整數 輸出格式 輸出第k小的數 輸入樣例 在這裡給出一組輸入。例如 10 4 2 8 9 0 1 3 6 7 8 2...