資料結構與演算法 九 二分查詢

2021-07-10 11:11:21 字數 3139 閱讀 7043

適用於排好序的資料,如:

int

array = ;

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

如我們現在要查詢陣列中是否存在8(key)這個數值 。

先找到陣列中間的數6,拿6與8進行比較,6比8小所以就在陣列的右邊在進行一趟二分查詢,這樣查詢每次可以減少一半數量的陣列長度。

#include 

using

namespace

std;

template

int getarraylen(t& array)

template

int binary_search (t& array , int key , int begin , int end)

int main();

for(;i<15;i++)

cout

<< "searching : "

<< i << "\t\t position : "

<< binary_search(array , i , 0 , getarraylen(array)) << endl;

return

0;}

searching : -2       position : -1

searching : -1 position : -1

searching : 0 position : 0

searching : 1 position : 1

searching : 2 position : 2

searching : 3 position : 3

searching : 4 position : -1

searching : 5 position : -1

searching : 6 position : 4

searching : 7 position : 5

searching : 8 position : 6

searching : 9 position : 7

searching : 10 position : -1

searching : 11 position : -1

searching : 12 position : -1

searching : 13 position : -1

searching : 14 position : -1

program ended with

exit code: 0

t(

n)=t

(2/n

)+o(

1) o

(log

n)

logn

#include 

using

namespace

std;

template

int getarraylen(t& array)

template

int binary_search_iterative(t& array, int key, int begin, int end)

return -1;

}int main();

for(;i<15;i++)

cout

<< "searching : "

<< i << "\t\t position : "

<< binary_search_iterative(array , i , 0 , getarraylen(array)) << endl;

return

0;}

searching : -2       position : -1

searching : -1 position : -1

searching : 0 position : 0

searching : 1 position : 1

searching : 2 position : 2

searching : 3 position : 3

searching : 4 position : -1

searching : 5 position : -1

searching : 6 position : 4

searching : 7 position : 5

searching : 8 position : 6

searching : 9 position : 7

searching : 10 position : -1

searching : 11 position : -1

searching : 12 position : -1

searching : 13 position : -1

searching : 14 position : -1

program ended with

exit code: 0

我們看到實現二與實現一執行的結果和空間複雜度是相同的,空間複雜度是不同的. t

(n)=

t(2/

n)+o

(1)

o(lo

gn)

o(1)

通過上面一些簡單的講解,

相信朋友們已經知道其原理及特性了。

本人能力有限,

如發現錯誤或不合理歡迎指正…

資料結構與演算法 二分查詢

二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...

資料結構與演算法,二分查詢

1.時間複雜度 每次能去掉一半即 logn 2.實現方式 while迴圈 與 遞迴 我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow 堆疊溢位 而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。3.實現關鍵點 我總結了下,一共有以下四點 sta...

資料結構與演算法 二分查詢

基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...