目錄
一、二分法
二、二分法變形
1、變形一:查詢第乙個值等於給定值的元素
2、變形二:查詢最後乙個值等於給定值的元素
3、變形三:查詢第乙個大於等於給定值的元素
4、變形四:查詢最後乙個小於等於給定值的元素
1、概念:一種針對有序資料集合的查詢演算法,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0。
2、時間複雜度分析:假設資料大小是 n,每次查詢後資料都會縮小為原來的一半,也就是會除以 2。最壞情況下,直到查詢區間被縮小為空,才停止。
可以看出來,這是乙個等比數列。其中 n/2k=1 時,k 的值就是總共縮小的次數。而每一次縮小操作只涉及兩個資料的大小比較,所以,經過了 k 次區間縮小操作,時間複雜度就是 o(k)。通過 n/2k=1,我們可以求得 k=log2n,所以時間複雜度就是 o(logn)
3、侷限
首先,二分查詢依賴的是順序表結構,簡單點說就是陣列。
其次,二分查詢針對的是有序資料:二分查詢只能用在插入、刪除操作不頻繁,一次排序多次查詢的場景中。針對動態變化的資料集合,二分查詢將不再適用
再次,資料量太小不適合二分查詢。
最後,資料量太大也不適合二分查詢:二分查詢的底層需要依賴陣列這種資料結構,而陣列為了支援隨機訪問的特性,要求記憶體空間連續,對記憶體的要求比較苛刻
/**
* binary search.
* * @param array: search array
* @param size: array size
* @param search_value: search value
* @return 1
*/int binary_search(int array, int size, int search_value)
else
else
} }
return -1;
}
/**
* 查詢最後乙個等於給定數值的元素.
* * @param array: search array
* @param size: array size
* @param search_value: search value
* @return 1
*/int binary_search_variant2(int array, int size, int search_value)
else
else
} }
return -1;
}
比如,陣列中儲存的這樣乙個序列:3,4,6,7,10。如果查詢第乙個大於等於 5 的元素,那就是 6。
/**
* 查詢第乙個大於等於給定數值的元素.
* * @param array: search array
* @param size: array size
* @param search_value: search value
* @return 1
*/int binary_search_variant3(int array, int size, int search_value)
else
else
} }
return -1;
}
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...
查詢演算法 二分法
二分查詢演算法的基本思想 一.首先確定該區間的中間元素位置 mid low high 2 mid代表區間內中間元素的位置 low代表區間內最左邊元素的位置 high代表區間內最右邊元素的位置 二.將待查key元素值與中間元素mid的值 array mid 比較,如果相等,則查詢成功,否則確定新的查詢...
演算法 二分法查詢
1 2 二分法實驗 31 設a 0 n 1 是乙個已排好序的陣列.4請改寫二分搜尋演算法,使得當搜尋元素x不在陣列中時,5返回小於x的最大元素的位置i和大於x的最大元素位置j.6當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置.72 設有n個不同的整數排好序後存放於t 0 n 1 中,8若存在...