DSA MOOC 有序向量二分查詢的三個 版本

2022-06-04 07:15:09 字數 1151 閱讀 9326

內容來自 tsinghuax: 30240184x 資料結構(2015秋) 課程的vector一章,對有序向量的二分查詢有三個版本

三個版本的函式原型是一致的,都是 rank search(t const& e, rank lo, rank hi) const;

其中,rank為向量元素的秩,在此被定義為int型,lo和hi分別是查詢區間的左、右界樁。

若查詢成功,則返回元素出現的秩;查詢失敗返回-1.

版本a和版本b在實現上的區別可用下圖描述,其中+1,+2表示進入此分支要進行的比較次數(即 if 語句的層數)。

就像老師說的,兩個版本都比對方的最壞情況好一點,比最好情況壞一點。

b的命中總在葉結點,而a可在中間結點命中(有點像b樹和b+),因此a有一半的情況比b要快,但b比a穩定且比較次數少。

1

//版本a,中點命中直接返回(可在中間結點退出搜尋),左右分支的比較次數不平衡(可用fibonacci查詢優化),不穩定,失敗返回-1

2 rank search_a(t const& e, rank lo, rank hi) const

10return -1;11

}1213//

版本b,只能在區間長度收縮為1(抵達葉結點)時退出搜尋,左右分支比較次數平衡,穩定,失敗返回-1

14 rank search_b(t const& e, rank lo, rank hi) const

19return a[lo] == e ? lo : -1

;20 }

版本c有更多語義上的規定,當查詢成功時,若有多個元素與e相等,返回秩最大的那個;當查詢失敗時,返回應插入的位置,即最後乙個小於等於e的元素的秩。

即對於成功或失敗,都返回「不大於e的秩最大的元素的秩」

1

//版本c

2 rank search_c(t const& e, rank lo, rank hi) const

7return --lo;

8 }

可用下圖描述版本c

線性向量 二分查詢

範圍區間 lo,hi 查詢 e 返回 下標 t 通用型別 function binarysearch t arr,t e,int lo,int hi else if arr mid e else return mid return 1 沒找到 改版 範圍區間 lo,hi 查詢 e 返回 下標 t 通...

有序表的二分查詢

問題描述 經典演算法 有序表的二分查詢 程式 include define size 10 csdn學院 2016級 目的 讓 見證成長 作為乙個初學的菜鳥,如 檔名稱 myfun150.c 問題描述 經典演算法 有序表的二分查詢 完成日期 2017年4月23日 int main int key,l...

二分查詢有序陣列

對於乙個有序字串陣列,用二分法查詢某一字串是否存在於該字串陣列中。函式原型為 bool binarysearch const vector array,const string target 注意這裡的有序指的是字典序,如字串陣列 a,ab,ac,bc,cd,d 就是有序字串陣列,而 a,b,ab ...