入門計算機必會的算法——二分查找法

2021-01-08 努力的浩浩

1、引言

筆者對於計算機的研究一直停滯不前,近期想對一些算法進行複習和進一步的研究,每天都會更新一個新的算法,算法有難有易,層層遞進。不希望能學得有多麼高深,只希望在一些最基本的算法上有編碼的思路,或者在一些生產環境中會應用一些算法來解決實際問題。就比如今天要介紹的第一個查找算法——二分查找法。

假設要在電話薄中找一個名字為K大頭的人,很習慣的辦法就是從頭開始翻頁,直到進入以K打頭的部分。但是這種方法的缺陷就是要逐一查找,時間較長。於是我們可以有另外一個思路就是每次從中間開始查找,而以K打頭的名字就在電話簿中間。

再舉一個簡單的場景,假設登錄Facebook時,Facebook會驗證是否為自己網站的用戶,那就必然要去資料庫中作比對,如果逐一對比則用戶等待的時間過長,影響用戶體驗,更合乎邏輯的做法是從中間開始查找,這樣就會節約很長的等待時間。

2、二分查找法

二分查找是一種算法,其輸入是一個有序的元素列表(注意:列表必須是有序的)。如果要查找的元素包含在列表中,二分查找則返回其位置,否則返回-1。

2.1 二分查找法的原理

舉一個示例來講解二分查找的工作原理。想必大家都玩過1~100的猜數字遊戲,目標是以最少的次數猜到這個數字。每次猜測後,會有人告訴你這個數和要找的數是大了還是小了。如果我們從1開始慢慢一個一個數字進行猜測,這樣的效率是很慢的,我們通常把這樣的查找方式叫做簡單查找,更準確的說法是傻找。

猜數字遊戲

比較合理的查找方法就是從中間開始查找,如果先猜50的情況下,如果有人給你說大了,那麼我們立馬排除了後面50個數字,正確答案一定在前面50個數字中,然後我們繼續猜測中間的數字,當有人告訴你小了,那麼前25個數字也就排除了。一直循環這樣下去,你會發現沒用幾步就可以得出正確答案。這就是二分查找的原理。

二分查找原理

2.2 二分查找法的代碼實現

在我學習的過程中,我會儘量使用Java語言來編寫算法,因為自己接觸Java的機會比較多,而且Java語言也比較好用,特此奉上Java實現二分查找法的原始碼。

2.3 運行時間 每一種算法都有自己的運行時間,而衡量運行時間的方法通常採用大O表示法。大O表示法是一種比較特殊的表示方法,指出了算法的速度有多快,根據剛才的推演,如果列表中有100個元素,最多只要猜7次就可以查找到正確答案,如果列表中包含40億個數字,最多需要猜32次。二分查找的運行時間由此稱為對數時間(或log時間),用大O表示法表示為O(logn)。

運行時間

相關焦點

  • 二分查找法(折半查找法)
    /*二分查找法說明:如果搜尋的數列已經有排序,應該儘量利用它們已排序的特性,以減少搜尋比對的次數 ,這是搜尋的基本原
  • 二分查找會更快嗎?Python中的二分查找與線性查找性能測試
    可以通過線性查找和二分查找來完成,但是要猜測哪個更快。為什麼?如果你最近參加過面試,你就會知道二分查找是面試官的最愛。您為什麼要花時間學習二分查找? C ++編程朋友可能已經告訴過您。 Python很慢。 您想確保自己的程序不會比所需的速度慢。學習Python時,您將學習進行線性查找以檢查元素是否在列表中。
  • 二分查找大集合(媽媽再也不用擔心我的二分查找了)
    來自:韓子遲 - 博客園作者:韓子遲【github:https://github.com/hanzichi 求關注】連結:http://www.cnblogs.com/zichi/p/5118032.html已獲轉載授權什麼是二分查找就不多說了
  • 聊聊一看就會一寫就跪的二分查找
    要說哪個算法的知名度較高,二分查找一定排得上號。後來我又在維基百科上發現了這樣一段話:儘管二分查找的基本思想相對簡單,但細節可以令人難以招架 —— 高德納當喬恩·本特利將二分查找問題布置給專業編程課的學生時,90%的學生在花費數小時後還是無法給出正確的解答,主要因為這些錯誤程序在面對邊界值的時候無法運行,或返回錯誤結果。1988年開展的一項研究顯示,20本教科書裡只有5本正確實現了二分查找。
  • 計算機入門必備算法——快速排序法
    準備停止學習一周,等把項目這一關過了,再繼續深入學習分享算法。後來吧今天遇到的事情都比較鬱悶,也無心情繼續開發項目。便想轉移一下注意力,繼續學習快速排序算法的內容。昨天了解了遞歸的使用原理。今天可以使用這個新技能來解決一個新的問題————快速排序。快速排序是一種排序算法,這個算法比前天學習的選擇排序要快得多,實屬優雅代碼的典範。
  • 數據結構與算法-2
    >(4)堆棧、(優先級)隊列(5)map、set(6)樹、圖(7)遞歸、分治、回溯(8)貪心算法(9)BFS、DFS(10)剪枝(11)二分查找(12)Trie樹(13)位運算(14)動態規劃(15)併查集
  • 你也能學的哈佛CS50,全美最受歡迎計算機入門課
    新智元報導  來源:哈佛  編輯:小勻  【新智元導讀】自學計算機,到底如何入門?  課程介紹  這是哈佛大學對計算機科學的知識型企業的介紹,適用於具有或沒有基礎編程經驗的專業和非專業的編程藝術,教會學生如何算法思考和有效解決問題。
  • 《Python程式設計師面試算法寶典》PDF超清版開源了文末附下載方式
    √ 採用抽絲剝繭式分析,深入解釋計算機科學的底層邏輯——算法及原理。√ 包括60多個算法題目,針對性強,拿來就用。通過實戰學習解題思路。《Python程式設計師面試寶典》是一本介紹Python程式設計師面試的圖書寶典。
  • 編程世界中的18個重要的算法
    Beam Search束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。
  • 使用Python和C語言實現二分法查找(折半查找)
    二分查找 叫折半查找,它對要查找的序列有兩個要求,一是該序列必須是有序的,二是該序列必須是順序存儲的。二分法查找算法的原理如下:1、 如果待查對象為空返回-1,表示查找不到目標元素2、 如果待查序列不為空,則將中間元素與要查找的目標元素進行匹配看是否相等,如果相等表示 查找成功,返回該中間元素的索引如果不相等再比較這兩個元素的大小
  • 人工智慧研學社 · 入門組 | 《終極算法》研習第二期
    可以說,機器學習所代表的人工智慧,已經不再是一個新鮮的概念,科技、醫療、金融、安防,甚至政治、社會研究,都逐漸將這類強大的算法整合到自己的架構中去,以發揮更大的效能。在這樣的浪潮之下,了解人工智慧與機器學習,是每一個關心科技與社會發展的人必做的功課。然而,這並不是一個低門檻的領域,人工智慧也有其漫長的歷史和複雜的發展結構,想要了解事情的全貌,無法一蹴而就。
  • 算法競賽小專題系列(1):二分法、三分法
    本系列是這本算法教材的擴展資料:《算法競賽入門到進階》. 羅勇軍、郭衛斌.
  • 面試手撕算法系列:二分法
    最近春招開始了,面試面著面著一言不合就開始手撕代碼手撕就手撕,接下來我打算寫幾個專題講講面試中手撕的常見題目 這些都是LeetCode上有的題目 手撕無非就是 樹、鍊表、二分、字符串這些常用的數據結構二分法查找,也稱為折半法,是一種在有序數組中查找特定元素的搜索算法。
  • JAVA必須掌握的數據結構和算法
    這個餘數就是key的編號即位置如果發生哈希衝突,就使用鍊表進行存儲(鏈地址法)給數組設定合適的空間非常重要除了鏈地址法以外,還有幾種解決衝突的方法。其中,應用較為廣泛的是「開放地址法」。這種方法是指當衝突發生時,立刻計算出一個候補地址(數組上的位置)並將數據存進去。
  • 機器學習入門必讀:6種簡單實用算法及學習曲線、思維導圖
    作者 | 盧譽聲來源 | 大數據DT(ID:hzdashuju)大部分的機器學習算法主要用來解決兩類問題——分類問題和回歸問題。在本文當中,我們介紹一些簡單但經典實用的傳統機器學習算法,讓大家對機器學習算法有一個基本的感性認識。有的人說機器學習入門並不難,有的人會覺得機器學習難以理解。那麼該如何去學習機器學習這種技術與方法呢?
  • JAVA編程——二分法查找
    一、二分法檢索過程二分法檢索(binary search)又稱折半檢索,二分法檢索的基本思想是設數組中的元素從小到大有序地存放在數組(array)中(註:二分法查找的關鍵,首先數組元素必須從小到大有序排列),(1)首先將給定值 key 與數組中間位置上元素的關鍵碼(key)比較,如果相等,則檢索成功
  • 直擊LeetCode最經典二分法算法題:Median of Two Sorted Arrays
    這道題是一道非常經典並且有相當難度的二分查找問題,徹底理解和實現之後其他二分查找問題相信都會迎刃而解。題目詳情原題如下:There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays.
  • 乾貨分享:計算機二級考試C語言基礎知識,送給考二級的同學!
    第一章 數據結構與算法1.1 算法1.算法的基本概念(1) 概念:算法是指一系列解決問題的清晰指令。(2) 4個基本特徵:可行性、確定性、有窮性、擁有足夠的情報。(3) 兩種基本要素:對數據對象的運算和操作、算法的控制結構(運算和操作時問的順序)。
  • 盤點| 機器學習入門算法:從線性模型到神經網絡
    原標題:盤點 | 機器學習入門算法:從線性模型到神經網絡 選自Dataconomy 機器之心編譯 參與:王宇欣、吳攀、蔣思源答案很簡單:算法(algorithm)。 機器學習是人工智慧(artificial intelligence)的一種,其本質上講,就是計算機可以在無需編程的情況下自己學習概念(concept)。這些電腦程式一旦接觸新的數據,就將會改變它們的「思考」(或者輸出)。為了實現機器學習,算法是必需的。算法被寫入計算機並在其剖析數據時給與其需要遵循的規則。
  • 大學生計算機二級考試C語言中的函數入門詳解
    C語言計算機二級考試必考考點之函數入門詳解一般來說理科生的大學生有一門必修課是編程,而想要從事軟體開發的人員,沒有C語言基礎是不行的。而C語言中比較重要的部分就是函數。函數是實現各種軟體開發功能的途徑,如果你對函數了如指掌,那麼軟體開發將是一件很簡單的事情了。