二分查找模板分析

模板說明:


你在網上看到的 99% 的二分查找問題會歸結於這 3 個模板中的一個。有些問題可以使用多個模板來實現,但是當你做更多的練習時,你會注意到一些模板比其他模板更適合某些問題。

注意:模板和它們的差異已被彩色標註如下。

這 3 個模板的不同之處在於:

  • 左、中、右索引的分配。
  • 循環或遞歸終止條件。
  • 後處理的必要性。

模板 #1 和 #3 是最常用的,幾乎所有二分查找問題都可以用其中之一輕鬆實現。模板 #2 更 高級一些,用於解決某些類型的問題。

這 3 個模板中的每一個都提供了一個特定的用例:

 

模板 #1 (left <= right):


  • 二分查找的最基礎和最基本的形式。
  • 查找條件可以在不與元素的兩側進行比較的情況下確定(或使用它周圍的特定元素)。
  • 不需要後處理,因爲每一步中,你都在檢查是否找到了元素。如果到達末尾,則知道未找到該元素。

 

模板 #2 (left < right):


  • 一種實現二分查找的高級方法。
  • 查找條件需要訪問元素的直接右鄰居。
  • 使用元素的右鄰居來確定是否滿足條件,並決定是向左還是向右。
  • 保證查找空間在每一步中至少有 2 個元素。
  • 需要進行後處理。 當你剩下 1 個元素時,循環 / 遞歸結束。 需要評估剩餘元素是否符合條件。

 

模板 #3 (left + 1 < right):


  • 實現二分查找的另一種方法。
  • 搜索條件需要訪問元素的直接左右鄰居。
  • 使用元素的鄰居來確定它是向右還是向左。
  • 保證查找空間在每個步驟中至少有 3 個元素。
  • 需要進行後處理。 當剩下 2 個元素時,循環 / 遞歸結束。 需要評估其餘元素是否符合條件。

 

時間和空間複雜度:


時間:O(log n) —— 算法時間

因爲二分查找是通過對查找空間中間的值應用一個條件來操作的,並因此將查找空間折半,在更糟糕的情況下,我們將不得不進行 O(log n) 次比較,其中 n 是集合中元素的數目。

爲什麼是 log n?

  • 二分查找是通過將現有數組一分爲二來執行的。
  • 因此,每次調用子例程(或完成一次迭代)時,其大小都會減少到現有部分的一半。
  • 首先 N 變成 N/2,然後又變成 N/4,然後繼續下去,直到找到元素或尺寸變爲 1
  • 迭代的最大次數是 log N (base 2) 。

 

空間:O(1) —— 常量空間


雖然二分查找確實需要跟蹤 3 個指標,但迭代解決方案通常不需要任何其他額外空間,並且可以直接應用於集合本身,因此需要 O(1) 或常量空間。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章