通過上一章的內容,我們發現二分查詢的實現**並不是很難,那是因為我們上一章寫的是最簡單的情況,即資料為有序集合而且不存在重複的資料;但是二分查詢的變形問題很多,要寫出沒有 bug 的變形二分查詢並不容易,今天我們來討論四種典型的變形問題:
假設現在陣列中存在重複的資料,我們希望找到第乙個值等於給定值得資料。
private
static
intbinarysearch
(int
numbers,
int fromindex,
int toindex,
int key)
else
if(midvalue < key)
else
else}}
return
-(low +1)
;}
我們先優化上一章的例子,按照 jdk 中 arrays 實現的方式進行改造,然後在 midvalue == key 這個條件中加入變形問題邏輯,具體分為以下幾種情況
mid 不等於 0 且 mid 的前乙個元素等於 key 值,說明第乙個元素在 low 至 mid-1 區間,我們設定 high = mid - 1,繼續查詢 測試
public
static
void
main
(string[
] args)
;int index =
binarysearch
(numbers,
0, numbers.length,19)
; system.out.
printf
("變形問題1-元素[%d]下標:[%d]\n",19
, index)
;}
執行結果:
變形問題1-元素[19]下標:[2]
同樣我們分析 midvalue == key 這個條件下的幾種情況
private
static
intbinarysearch
(int
numbers,
int fromindex,
int toindex,
int key)
else
if(midvalue < key)
else
else}}
return
-(low +1)
;}
測試
public
static
void
main
(string[
] args)
;int index =
binarysearch
(numbers,
0, numbers.length,19)
; system.out.
printf
("變形問題2-元素[%d]下標:[%d]\n",19
, index)
;}
執行結果:
變形問題2-元素[19]下標:[3]
在有序陣列中,查詢第乙個大於等於給定值的元素。比如,陣列中儲存的這樣乙個序列:3,4,6,7,10。如果查詢第乙個大於等於 5 的元素,那就是 6 。
我們分析 midvalue >= key 這個條件下的幾種情況
private
static
intbinarysearch
(int
numbers,
int fromindex,
int toindex,
int key)
else
}else
}return
-(low +1)
;}
測試
public
static
void
main
(string[
] args)
;int index =
binarysearch
(numbers,
0, numbers.length,19)
; system.out.
printf
("變形問題3-元素[%d]下標:[%d]\n",19
, index)
;int index2 =
binarysearch
(numbers,
0, numbers.length,20)
; system.out.
printf
("變形問題3-元素[%d]下標:[%d]\n",20
, index2)
;}
執行結果:
變形問題3-元素[19]下標:[2]
變形問題3-元素[20]下標:[4]
我們分析 midvalue <= key 這個條件下的幾種情況
private
static
intbinarysearch
(int
numbers,
int fromindex,
int toindex,
int key)
else
}else
}return
-(low +1)
;}
測試
public
static
void
main
(string[
] args)
;int index =
binarysearch
(numbers,
0, numbers.length,18)
; system.out.
printf
("變形問題4-元素[%d]下標:[%d]\n",18
, index)
;}
執行結果:
變形問題4-元素[18]下標:[1]
二分查詢能解決的問題,絕大部分我們更傾向於用雜湊表或者二叉查詢樹。即便是二分查詢在記憶體使用上更節省,但是畢竟記憶體如此緊缺的情況並不多。那二分查詢真的沒什麼用處了嗎?
實際上,上一章講的求「值等於給定值」的二分查詢確實不怎麼會被用到,二分查詢更適合用在「近似」查詢問題,在這類問題上,二分查詢的優勢更加明顯。比如今天討論的這幾種變型問題,用其他資料結構,比如雜湊表、二叉樹,就比較難實現了。
《資料結構c 》 第十二章
目錄 排序演算法 快排 選取與中位數 眾數 歸併向量的中位數 k 選取問題 希爾排序 shellsort 快排與歸併的區別 兩者均屬於分治演算法 然而歸併是歸併需要o n 快排是問題劃分需要o n 快排的問題在於劃分出來的子問題並不一定均衡,其最壞情況下o nlogn 的複雜度,然而其大多數情況下效...
重新整理資料結構與演算法 二分查詢法 十二
什麼是二分查詢呢?直接給乙個位址哈,避免誤解。二分法查詢 9751511 1 根據我發的這個鏈結呢?我們知道通過二分查詢一定有乙個硬性要求,那就是說一定要按照某種順序排列,不一定是大小。比如說有乙個陣列為 如果如果你要查詢100,如果按照遍歷的話,那麼要到最後乙個。如果通過二分法,那麼第乙個比較的就...
《演算法導論》學習筆記 第十二章 二叉查詢樹
查詢樹以一種資料結構,它支援多種動態集合操作,包括search,minimum,maximum,predecessor,successor,insert以及delete,它既可以用作字典,也可以用作優先佇列。二叉查詢樹的執行的基本操作的時間與樹的高度成正比。對於一棵含有n個結點的完全二叉樹,這些操作...