開門見山,直接上題目。
7-2 改寫二分搜尋演算法 (20 分)
設a[0:n-1]是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。
輸入有兩行:
第一行是n值和x值; 第二行是n個不相同的整數組成的非降序序列,每個整數之間以空格分隔。
在這裡給出一組輸入。
6 5
2 4 6 8 10 12
在這裡給出相應的輸出。
1 2
為什麼要選擇這道題來講呢?那就是因為我太菜了,理解不了第三題的時間複雜度o(logn)的演算法,只好拿這道題講一下了。
好了,這裡講一下我的思路吧。
首先,需要理清題意,題目說的是返回下標,而不是位置,所以陣列裡的陣列最好從下標0開始,這樣子到後面的時候就不會弄的很亂;
我們在進一步分析一下,返回下標--如果找到了需要尋找的數,那麼就返回兩個相同的下標即找到目標數字的下標。那麼沒找到的情況呢?題目也很明顯給了兩個提示了,就是返回乙個它鄰邊的兩個數,如下:
但是還有乙個問題,那就是邊界問題。題目已經給出提示了,這裡就不重複贅訴了。
理清思路之後,我開始構思演算法了,很明顯,這是乙個典型的二分演算法,畢竟題目已經是乙個很明顯的提示了。
那麼基於二分演算法,如果找到目標數字就返回改數字所在下標,若果沒有找到就返回「l」下標;該函式如下:
int find(int* a, int l, int r,int goal)對於沒找到目標函式的情況,只需要對上面find函式的返回值輸出乙個「l - 1」 和 「l」;else if(a[mid] < goal)
else
} return l; //返回「l」下標,即為找不到目標數字時的右鄰邊下標;
}
搞定這個函式之後剩下的事情就簡單很多啦,主函式只要判斷一下有無找到目標函式,然後分情況輸出就ok。
下面是ac**:
#include using改寫二分演算法namespace
std;
int find(int* a, int l, int r,int
goal)
else
if(a[mid]
else
}returnl;}
intmain ()
時間複雜度:陣列長度為n,因為對陣列進行了二分查詢,問題規模是n,所以時間複雜度為o(logn);
空間複雜度:只開了幾個變數,所以空間複雜度為o(1);
打**我覺得最重要的還是理清自己的思路吧,有乙個好的構思才能做出好的演算法;還有注意細節;
我覺得我好菜;遇到難題半途..哦不,是知難而退。
python第二章上機實踐 演算法第二章上機實踐報告
1.實踐題目名稱 找第k小的數 2.問題描述 在n 1 n 1000 個無序的整數中找出第k小的數,且時間複雜度為o n 3.演算法描述 int partition int a,int left,int right 函式功能 將輸入的陣列進行排序,排序後的陣列需要滿足 基準左邊的數都小於基準,基準右...
第二章 遞迴演算法設計與分析
1.1.2遞迴應滿足的條件 1.1.3何時使用遞迴 直接遞迴 自己呼叫自己的遞迴 間接遞迴 a呼叫b,b呼叫a 如果乙個遞迴過程或遞迴函式中遞迴呼叫語句是最後一條執行語句,則稱這種遞迴呼叫為尾遞迴。例1.1 設計求n!n為正整數 的遞迴演算法int fun int n 這是乙個直接遞迴,又由於遞迴呼...
演算法第二章上機報告
7 1 二分查詢 20 分 輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出x所在的下標 0 n 1 及比較次數。若x不...