二分查詢爬過的坑

2021-08-07 13:30:30 字數 1103 閱讀 7488

二分查詢看似簡單,但是刷多了二分查詢的題,就會遇到很多意向不到的坑,真的是實踐出真知啊,現總結下二分查詢遇到的坑。

一 樸素版二分查詢:在有序陣列中查詢關鍵字,找到就返回下標,不管重複不重複。

//樸素版二分查詢

int bitsearch(int a,int n,int k)else

if(a[mid] > k)else

}return -1;

}

仔細看上邊**後面帶注釋的兩部分,現在來解釋下。

①迴圈條件為什麼不是 (l>1)不會出現溢位問題,而且移位操作比較節省時間。

二 找最小最大

有序非遞減序列中,找k第一次出現的位置,可能有重複。

int findforstindex(int a,int n,int k)else

}if(a[r] == k) return r;

return -1;

}

①如果用while(l<=r),則可能會出現死迴圈,如當l==r,a[mid]=a[l] >= k時,r=mid,再到while迴圈裡判斷仍然滿足條件,因為是把r自己賦值非自己所以是死迴圈。

②while迴圈外部為什麼還需要判斷一次?

小於key的左半部分一定是被砍掉的,但while迴圈中被砍掉最後乙個元素跳出迴圈後,剩下的乙個元素可能有兩種情況,key 和比key大的值,所以必須進行一次判斷。

二 找最小最大

有序非遞減序列中,找k最後一次出現的位置,可能有重複。

int findlastindex(int a,int n,int k)else

}if(a[r] == k) return r;

else

if(a[l] == k) return l;

return l;

}

①如果用while(l總結:容易出錯的點

1 迴圈終止條件

2 返回值

3 left,right的賦值

4 最好寫幾個數判斷一下,尤其是特殊情況,如長度為1,l==r,l==r-1,key在兩端的情況驗證一下。

二分查詢有個坑

內容會持續更新,有錯誤的地方歡迎指正,謝謝 例題 在序列 22,34,55,77,89,93,99,102,120,140 中,採用二分查詢,分別查詢77,34,99,所需的查詢次數分別為 答案 4,2,4 理由 假設低下標用low表示,高下標用high表示 查詢77 開始low 0,high 9 ...

superset爬過的坑

superset是資料分析與視覺化平台。該工具主要特點是可自助分析 自定義儀錶盤 分析結果視覺化 匯出 使用者 角色許可權控制,還整合了乙個sql編輯器,可以進行sql編輯查詢等,原來是用於支援druid的視覺化分析,後面發展為支援很多種關聯式資料庫及大資料計算框架,如 mysql,oracle,p...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...