《演算法設計與分析》 演算法第二章上機實踐報告

2022-06-21 20:24:13 字數 1785 閱讀 1219

開門見山,直接上題目。

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)

else if(a[mid] < goal)

else

} return l; //返回「l」下標,即為找不到目標數字時的右鄰邊下標;

}

對於沒找到目標函式的情況,只需要對上面find函式的返回值輸出乙個「l - 1」 和 「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不...