資料結構與演算法之四 搜尋演算法

2021-07-13 08:06:16 字數 4514 閱讀 2231

目標在本章中,你將學習: 使用線性搜尋技術搜尋資料和二叉搜尋技術搜尋資料 

線性搜尋:

是最簡單的搜尋方法,

也稱作順序搜尋,

包括將用該條目逐一與列表中的條目進行比較,

線性搜尋通過比較所需的元素與列表中第乙個元素進行。

如果值不匹配:

則所需的元素將與列表中的第二個元素作比較。

如果值還是不匹配:

則所需的元素將與列表中的第三個元素作比較。

這個過程將一直持續下去,直到:

找到所需的元素或到達列表的未尾為止。

使用線性搜尋演算法編寫乙個演算法以搜尋

員工記錄列表

中給定的員工的工號:

1. 

讀取要搜尋的工號

(首先確定你要找的工號

) 2.

設定i = 0   n

是陣列的最大值下標(上界

) 3.

重複步驟4直到

i > n

或arr[i] = employee id

4. i

值增加1 5.

如果i > n: 顯示

「未找到」

否則 顯示「

已找到」

搜尋演算法的效率是由演算法的執行時間決定的。

在最佳情況下:

元素位於列表的第乙個位置。

比較次數為1。

線性搜尋的最佳的效率是

o(1)

。 在最差情況下:

元素位於列表中最後乙個位置或者它根本不存在於該列表中

。 比較次數為元素的數。

線性搜尋最差的效率是

o(n)

。在平均情況下:

線性搜尋的平均比較數由最佳和最差搜尋中的平均比較數決定

。 線性搜尋的平均效率是

1/2(n + 1)

課間思考

您要在乙個包含

5000

個元素的陣列中應用線性搜尋來搜尋乙個元素,如果在搜尋的

最後,您發現該元素不在該陣列中,則為了在該給定的列表中搜尋所需的元素您要

進行多少次的比較?

答案: 5,000

問題描述:

編寫乙個在含有最多

20個數的陣列中使用線性搜尋演算法搜尋乙個給定數的程式,

如果要搜尋的元素在列表中出現多次,則該程式應該顯示第一次出現的位置,還

應該顯示所作的比較總數。

二叉搜尋演算法:

用於搜尋大列表,

以十分少的比較來搜尋資料,

只要要搜尋的列表已經排序,則可以使用二叉搜尋演算法

考慮乙個示例。

您要在以字母順序排列的**目錄中搜尋名字

steve

。 要使用二叉搜尋演算法搜尋名字

steve

: 在中間開啟**目錄以確定哪一半包含該名字。

在那一半的中間再開啟以確定哪一半包含該名字。

重複此過程直到找到所需的名字為止。

二叉搜尋每次就減少了一半的搜尋頁數。

編寫乙個演算法以實現二叉搜尋演算法。

1.接受要搜尋的元素

(確定要查詢的值

) 2.

設定lowerbound = 0 

3.設定upperbound = n – 1

4.設定mid = (lowerbound + upperbound)/2

5.如果arr[mid] =

所需元素:

a.顯示「

已找到」

b.轉到步驟

10 6.

如果所需元素

< arr[mid]:

a.設定upperbound = mid – 1 7.

如果所需元素

> arr[mid]:

a.設定lowerbound = mid + 1

8.如果lowerbound <= upperbound:

a.轉至步驟

4 9.顯示「

未找到」

10.退出

在二叉搜尋演算法中的每個步驟中,搜尋區域都減半。

該演算法的最好情況是如果要搜尋的元素正好位於列表的最中間的位置:

此情況的比較數為1。

在最差情況下,列表中未找到所需元素

: 在第一次對分後,搜尋空間減少到

n/2個元素,其中

n 是原始列表中的元素數。

第二次對分後,搜尋空間減少到

n/4,即

n/22

個元素。

經過第i 次對分後,搜尋空間減少到

n/2i 

元素。

課間思考

在___________

搜尋演算法中,您從列表的一端開始並且掃瞄整個列表直到找到所需

項或到達列表的末尾為止。

答案: 線性

要執行__________

搜尋演算法,列表應該是經排序的。

答案: 二叉

問題描述:

編寫乙個程式,它使用二叉搜尋在含有最多

20個元素的陣列中搜尋乙個數,假設

陣列元素是以公升序輸入的。如果陣列中有多個要搜尋的數,則發現乙個匹配後搜

索就停止了。程式還應該顯示所作的比較總數。

小結

在本章中,你已經學到:

線性搜尋的最佳效率是

o(1)

,最差效率

o(n)

。 要應用二叉搜尋演算法,應該確保要搜尋的列表是排過序的。

二叉搜尋的最佳效率是

o(1)

,最差效率是

o(log n)。

/*從8個數中查詢數字*/

using system;

class ban

; //定義有8個整數的陣列

console.writeline("請輸入您的工號個數:");

int n; //n為陣列的上界

n=convert.toint32(console.readline()); //n就是陣列的長度(個數)

int arr=new int[n]; //定義有10個數字的陣列

for(int j=0;jn 或 arr[i] = id 才退出.

char ch='y'; //定義我們不斷查詢的條件,如果為y|y,則一直查詢;n|n:則退出查詢.

while((ch=='y')||(ch=='y'))

//接受陣列元素

console.writeline("------------------------------------------");

console.writeline("---------------輸入陣列元素---------------");

console.writeline("------------------------------------------");

for(i=0;i");

string s1=console.readline();

arr[i]=int32.parse(s1);

} char ch='y';

do

if(item==arr[mid])

console.write("\n"+item.tostring()+"發現了位置:"+(mid+1).tostring());

else

console.write("\n"+item.tostring()+"在陣列中沒有發現");

console.write("\n比較次數:"+ctr);

ch=char.parse(console.readline());

}while((ch=='y')||(ch=='y'));

} }

/*編寫乙個在含有20個數的數中使用線性搜尋演算法乙個給定數的程式,如果要搜尋的元素在列表中出現多次,則該程式應該顯示第一次出現的位置,還應該顯示所作

的比較總數。

*/using system;

class sequentialsearch

//接受陣列元素

console.writeline("------------------------------------------");

console.writeline("---------------輸入陣列元素---------------");

console.writeline("------------------------------------------");

for(i=0;i");

string s1=console.readline();

arr[i]=int32.parse(s1);

} char ch='y';

int ctr;

do{ //接受要搜尋的數

console.write("\n請輸入您要搜尋的數:");

int item=convert.toint32(console.readline());

//應用線性搜尋

ctr=0;

for(i=0;i

python資料結構 搜尋演算法

下面是幾種搜尋列表的幾種演算法和它的複雜度分析。python的min函式返回列表中的最小的項。下面是為了研究它的複雜度開發出來的演算法。usr bin python coding utf 8 def indexofmin lyst minindex 0 currentindex 1 while cu...

四 搜尋演算法

特點 適用於隨機的資料,從頭開始,乙個個查詢。隨著資料量增大,查詢越耗時。步驟 1.i特點 適用於已經排好序的資料,找到中間資料,通過比較判斷資料在中間資料的哪一邊,再將剩下的資料分為兩半,不停查詢 查詢範圍縮小一半 步驟 1.當查詢資料大於1時進行查詢 2.當等於中間資料時,找到break跳出迴圈...

高階演算法之「搜尋演算法」

1.1 js中的排序和搜尋 1.2 排序演算法 1.3 搜尋演算法2.1 氣泡排序 2.2.1 思路 2.2.2 動畫演示 氣泡排序動畫演示 2.2.3 coding partarray.prototype.bubblesort function 2.2.4 時間複雜度 2.2 選擇排序 2.2.1...