如何在Python中進行二進位搜索?搜索算法,中級python技術點

2020-12-12 科技叮鈴噹啷

它指的是將元素的集合為兩半,並在算法的每一步扔掉它們中的一個。這樣可以大大減少查找元素所需的比較次數。但是有一個陷阱,必須首先對集合中的元素進行排序

其背後的想法類似於在書中查找頁面的步驟。首先,您通常將書打開到一個完全隨機的頁面,或者至少打開一個與您認為所需頁面可能接近的頁面。

有時,您很幸運可以在第一次嘗試時找到該頁面。但是,如果頁碼太少,則說明該頁必須在右側。如果您在下次嘗試時過衝,並且當前頁碼高於您要查找的頁碼,那麼您可以確定它必須介於兩者之間。

您重複此過程,但是要檢查位於該新範圍中間的頁面,而不是隨機選擇頁面。這樣可以最大程度地減少嘗試次數。

注意:有時,如果值是均勻分布的,則可以使用線性插值來計算中間索引,而不是取平均值。算法的這種變化將需要更少的步驟。

第一次嘗試時,中間的元素恰好是檸檬。由於它比草莓大,因此可以丟棄右邊的所有元素,包括檸檬。您將頁碼上限移動到新位置並更新中間索引:

限制要搜索的頁面範圍的頁碼稱為下限和上限。在二進位搜索中,通常以第一頁作為下界,最後一頁作為上限。必須在運行時更新兩個邊界。例如,如果您所翻的頁面低於您要查找的頁面,則這是您的新下限。

假設您要在按大小升序排列的一系列水果中尋找草莓:

第一次嘗試時,中間的元素恰好是檸檬。由於它比草莓大,因此可以丟棄右邊的所有元素,包括檸檬。您將頁碼移動到新位置並更新中間索引:

現在,您只剩下開始時所用水果的一半。當前的中間元素確實是您要尋找的草莓,搜索結束了。如果不是,那麼您將相應地更新邊界並繼續直到它們彼此通過。例如,尋找在草莓和奇異果之間缺失的李子,將得到以下結果:

請注意,為了找到所需的元素,並不需要進行很多比較。這就是二進位搜索的魔力。即使您要處理一百萬個元素,您最多只需要進行少量檢查。由於減半,該數字不會超過元素總數的對數底數2。換句話說,在每個步驟中剩餘元素的數量減少了一半。

這是可能的,因為元素已經按大小排序。但是,如果您想通過其他鍵(例如顏色)找到水果,則必須再次對整個集合進行排序。為了避免排序的開銷,您可以嘗試預先計算同一集合的不同視圖。這有點類似於創建資料庫索引

考慮如果添加,刪除或更新集合中的元素會發生什麼。為了使二進位搜索繼續工作,您需要保持正確的排序順序。這可以通過該bisect模塊來完成,您將在接下來的部分中閱讀該模塊。

文章中,您將看到如何在Python中實現二進位搜索算法。現在,讓我們面對IMDb數據集。請注意,搜索的人與以前不同。這是因為必須對數據集進行排序以進行二進位搜索,從而對元素進行重新排序。新元素的位置大致與以前相同,以保持測量的可比性:

答案幾乎是即時的。通常情況下,二進位搜索只需要幾微秒的時間就可以找到全部900萬個元素中的一個!除此之外,所選元素的比較次數幾乎保持不變,這與以下公式一致:

查找大多數元素將需要最多數量的比較,這可以從集合大小的對數得出。相反,只有一次比較時,中間只有一個元素可以找到。

二進位搜索是分而治之技術的一個很好的例子,該技術將一個問題劃分為許多同類的較小問題。然後將各個解決方案合併以形成最終答案。這種技術的另一個眾所周知的例子是快速排序算法。

注意:不要將分治法與動態編程混淆,動態編程是一種有點類似的技術。

與其他搜索算法不同,二進位搜索不僅可以使用搜索,還可以使用。例如,它允許進行集合成員資格測試,找到最大值或最小值,找到目標值的最近鄰居,執行範圍查詢等等。

如果速度是頭等大事,那麼二進位搜索並不總是最佳選擇。甚至有更快的算法可以利用基於散列的數據結構。但是,這些算法需要大量額外的內存,而二進位搜索提供了很好的解決方案。

相關焦點

  • Python中排序算法的重要性,希爾排序 ShellSort,中級python技術
    Python中的Timsort算法,Timsort算法的優缺點,中級python技術點Python中的快速排序算法,快速排序的優缺點,中級python技術點Python中的合併排序算法,合併排序的優缺點,中級python技術點
  • Python中的插入排序算法,插入排序的優缺點,中級python技術點
    屆時,您需要將卡插入正確的位置,然後重新開始製作新卡,重複進行直到您手上的所有卡都被排序為止。在Python中實現插入排序插入排序算法的工作原理與紙牌示例完全相同。這是Python中的實現:與冒泡排序不同,此插入排序的實現通過將較小的項目向左推來構造排序列表。
  • 教程 | 如何在Python中快速進行語料庫搜索:近似最近鄰算法
    隨後,如果我們有這些詞嵌入對應的語料庫,那麼我們可以通過搜索找到最相似的嵌入並檢索相應的詞。如果我們做了這樣的查詢,我們會得到:King + (Woman - Man) = Queen我們有很多方法來搜索語料庫中詞嵌入對作為最近鄰查詢方式。絕對可以確保找到最優向量的方式是遍歷你的語料庫,比較每個對與查詢需求的相似程度——這當然是耗費時間且不推薦的。
  • 基於二進位搜索的RFID標籤防碰撞算法研究
    空分多路(SDMA)法是在分離的空間範圍內進行多個目標識別的技術。SDMA法的缺點是複雜的天線系統和相當高的實施費用,因此採用這種技術的系統一般是在一些特殊的應用場合,如這種方法在大型的馬拉松活動中就獲得了成功。  頻分多路(FDMA)法是把若干個使用不同載波頻率的傳輸通路同時供通信用戶使用的技術。
  • Python中的冒泡排序算法,冒泡排序的優缺點,中級python技術點
    Python中的冒泡排序算法冒泡排序是最直接的排序算法之一。它的名字來自於算法的工作方式:每經過一個新遍歷,列表中最大的元素就會向正確的位置「冒泡」。冒泡排序包括對列表進行多次遍歷、逐個比較元素以及交換順序混亂的相鄰項。
  • 用python實現遺傳算法
    最近事情比較多,一個月沒有寫公眾號了,但也積累了些不錯的內容可以分享,今天就給大家介紹的是遺傳算法,並用python加以實現。在遺傳算法的學習過程中,在CSDN上看到一篇已有人分享的python代碼,因此直接借鑑過來,並結合《數學建模與數學實驗》進行補充。
  • RFID二進位搜索法防碰撞的實現
    若有兩張以上的射頻卡同時反應,則讀寫器認為該數據無效,會重發指令,直到識別出場中的所有射頻卡。IS015693標準就採用了這種時隙方法。 本文主要針對射頻卡控制法,即基於TDMA的二進位搜索防碰撞算法進行分析和研究,並分別在性能上作分析。二進位搜索算法的思路是:通過定義讀寫器與多個射頻卡之間一組規定的指令序列,從中選出一張卡,並完成二者的數據交換。
  • python進位轉換:十進位轉二進位的用法
    我們在學習python時候肯定會碰到關於進位轉換,其實這是非常簡單的,這個就像小學學習數學乘法口訣意義,只要記住轉換口訣即可輕鬆應用,一起來看下具體的操作內容吧~一、python進位轉換dec(十進位)—> bin(二進位)dec(十進位)—> oct(八進位)dec(十進位)—> hex(十六進位)二、十進位我們所熟知的十進位,其實是從 0 開始,數到 9 之後,就跳到
  • Python中的Timsort算法,Timsort算法的優缺點,中級python技術點
    然後,算法遍歷列表,將元素收集到run中,並將它們合併到一個排序的列表中。在Python中實現Timsort在本文中,您將創建一個簡單的Python實現,它演示了Timsort算法的所有部分。如果您感興趣,還可以查看Timsort的原始C實現。
  • 大跌眼鏡:python print竟然不能輸出二進位內容
    從來都沒有一把由壞鋼鑄成的好刀----班傑明·富蘭克林大家好,我是一個專業的python後臺研發高級工程師,本質上並不是一個小編,但是有時候老闆也會要求我來寫寫文章。我在這個團隊裡面最主要的工作就是寫python代碼了,大家在文章中看到的代碼,很多都是我寫出來的哦。
  • 送你一份Python算法的打怪升級路線圖 | 用 Python 實現各種常用算法
    對程式設計師來說,算法的重要性不言而喻,算法基礎是否紮實,間接決定了你是月薪5000,還是月薪50000。實驗樓上線了一門免費的Python算法入門課——【用 Python 實現各種常用算法】,主要包括兩部分內容:一是各種算法的基本原理講解,二是各種算法的代碼實現,內容由淺入深,非常適合剛入門Python的同學學習。
  • python推薦 | 面向地學領域的Python庫匯總
    這是一篇告訴你如何更好的使用Python來解決地學領域問題的文章。數據處理•NetCDF格式 : netCDF4-python,h5py,h5netcdf,xarray等。除了上述簡單的數據處理庫之外,python還提供了NCO和CDO工具的封裝,pynco和cdo,提供了更多的便捷操作。
  • Python如何實現超長整數
    為了在將內存分配給數組ob_digit時更高效,python進行了過度提供,然後依賴於ob_size的值來確定數組中所包含的元素的實際數量。存儲一種簡單的按數位順序存儲整數的方法是在數組的一項中存儲一個十進位數,然後像小學數學那樣執行加法和減法運算。使用這種方法,數字5238將被存儲為:
  • Python基礎知識點手冊——字符串方法(二)
    對於整數類型,當使用二進位、八進位或十六進位輸出時,此選項會為輸出值添加相應的 '0b', '0o' 或 '0x' 前綴。',' 選項表示使用逗號作為千位分隔符。對於感應區域設置的分隔符,請改用 'n' 整數表示類型。'_' 選項表示對浮點表示類型和整數表示類型 'd' 使用下劃線作為千位分隔符。對於整數表示類型 'b','o', 'x' 和 'X',將為每 4 個數位插入一個下劃線。
  • 最全 Python 算法實現資源匯總!
    為了幫助大家在這個假期能提高學習效率,進階 Python 技能,筆者為大家推薦了一份用 Python代碼實現算法的資源帖,涵蓋從入門到高級的各類算法。下文中,筆者首先對項目的整體內容進行了一個歸納,之後為大家選取了幾個內容比較豐富的部分,供大家更高效地使用這一資源。
  • Python中的合併排序算法,合併排序的優缺點,中級python技術點
    Python中的合併排序算法合併排序是一種非常有效的排序算法。它基於分治法,這是一種用於解決複雜問題的強大算法技術。為了正確理解分治法,您應該首先了解遞歸的概念。遞歸涉及將問題分解成較小的子問題,直到它們足夠小以至於無法解決。在編程中,遞歸通常由調用自身的函數表示。
  • Python中的快速排序算法,快速排序的優缺點,中級python技術點
    Python中的快速排序算法就像合併排序一樣,快速排序算法採用分治法的原理將輸入數組分為兩個列表,第一個包含小項目,第二個包含大項目。然後,該算法將對兩個列表進行遞歸排序,直到對結果列表進行完全排序為止。劃分輸入列表稱為對列表進行分區。
  • 從零開始:用Python實現KNN算法
    當我們需要預測一個新實例的某個屬性A時,KNN算法會搜索訓練數據集找到K個最相似的實例。這些相似實例的A屬性會被總結歸納,作為新實例A屬性的預測。如何判斷實例之間的相似程度,這需要具體看數據的類型。對於實數數據,我們可以使用歐式距離。對於分類或者二進位數據,我們可以使用漢明距離。對於回歸問題,可以使用預測值的平均值。對於分類問題,可以返回最普遍的一類。
  • 基於RFID的二進位防碰撞算法的改進
    防碰撞問題的研究主要解決如何快速和準確地從多個標籤中選出一個與閱讀器進行數據交流,而其他的標籤同樣可以從接下來的防碰撞循環中選出與閱讀器通信。   2 傳統二進位算法   2.1 傳統二進位算法的基本原理   在二進位搜索算法中,要能夠檢測出多張卡的存在,卡片的返回數據必須具有唯一性,且卡片在傳輸其UID(Ubiquitous Identifications,身份識別標籤)時必須準確、快速、同步,這是防碰撞檢測的關鍵。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    Mov 1-2在線編譯工具weblde使用之指南.mov 2-1如何在列表,字典,集合中根據條件.MOV 2-2 3 4命名 統計 字典.mov 2-5公共鍵.mov 2-6 如何讓字典保持有序.mov 2-7歷史記錄.mov 3-1 2迭代器.mov 3-3如何使用生成器函數實現迭代對象