資料結構與演算法 第十二章 二分查詢的四種變形問題

2021-10-07 04:56:40 字數 3328 閱讀 2714

通過上一章的內容,我們發現二分查詢的實現**並不是很難,那是因為我們上一章寫的是最簡單的情況,即資料為有序集合而且不存在重複的資料;但是二分查詢的變形問題很多,要寫出沒有 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個結點的完全二叉樹,這些操作...