13.從13億次到31次,神奇的「二分查找」

2020-12-24 和孩子一起學Python

百家號不支持代碼格式,文章裡的代碼排版都是亂的。

如果需要拷貝代碼,可以去同名的微信公眾號

接上題在一個列表中查找符合條件的元素,需要遍歷整個列表,逐個元素檢查。

上一篇介紹過,遍歷列表有2種方式。

import random

a = random.sample(range(1,100),80)

for x in a:

if 88 == x:

print("列表裡有88")

break

else:

print("列表裡沒有88")

import random

a = random.sample(range(1,100),80)

for i in range(0,len(a)):

if 88 == a[i]:

print("第%d個元素是88"%(i+1))

break

else:

print("列表裡沒有88")

第一種方式看上去更簡單,但一般情況下,我們不僅需要找到這個元素,還需要知道元素在列表中的位置,所以,反而第二種方式用得更多。

無處不在的查找

查找恐怕是這個世界上每天發生得最多的事情了。尤其是在網際網路上。

我們每天

在百度上查找資料

在淘寶、京東上查找商品

在QQ音樂、網易音樂上查找歌曲

在晉江查找小說

……

但可能我們都沒有思考過一個問題,電腦是如何從數以億計的海量數據裡找到我們想要?我們試著用一個簡單的例子來說明海量數據的查找其實是一件很有技術含量的事情。

比如說辦理護照,窗口的工作人員要你提供身份證號碼,然後在電腦上輸入你的身份證號碼,查找核實你的資料。

我們假設,全國所有人的身份證號碼都保存在一個列表裡。那麼這個列表就有13億多個元素。按照我們文章開頭介紹的方法,每次查找都需要遍歷整個列表,最差的情況就需要找13億次。

我們知道電腦的速度很快,1秒鐘甚至可以找1000萬次。

可是 13億/1000萬 = 130秒 ,需要 2 分多鐘。

真的需要這麼長時間嗎?有沒有更快的辦法?

神奇的「二分查找」

假設下面的列表,一共有13億個數字

最小是3,最大是100億。

數字從小到大排列,但沒有規律。

需要在裡面查找數字 x = 314159260

需要從第一個元素依次往後查找嗎?

顯然不需要。因為數字有序!

拿x和列表中間的元素比較,如果相等,就找到了。

如果 x 比中間元素大,顯然,我們只需要在中間元素右邊裡繼續查找。

反之亦然。

這樣,每次都可以把查找的範圍縮小一半。

這就是「二分查找

最多需要查找多少次呢?

其實就是求 n 除以多少次2之後等於1。

也就是數學上以2為底的對數函數:log2(n)

math模塊提供了以2為底的對數函數 log2()。

也就是說最壞的情況,也只需要31次,就能完成!

和13億次相比,簡直是天壤之別。

這就是「二分查找」的神奇之處。

Python實現「二分查找」

我們先生成一個從0到1億的數列。

注意:range()函數返回的並不是列表類的實例,但是是可以被循環的數列,所以滿足我們的需求。

l1 = range(0,100000000)

然後我們去查找一個不可能存在的數字, x = 100000001。

當然,你沒有上帝視角,並不知道這個數字不存在。

所以在學會「二分查找」之前,只能逐一查找。

我們再介紹一個新的模塊 datetime. 它有函數可以返回程序執行時的時間。

在for循環查找之前,和查找結束後。

我們分別用 print(datetime.datetime.now())列印出當時的時間。

然後2個時間相減就是查找用的時間。

我們發現,要完成1億次查找,電腦用了將近 16 秒鐘!

和人相比,已經非常非常快了。

但如果是十億,甚至百億、千億的數據,這個速度就太慢,太慢了!

如果用「二分查找」呢?

準備查找

列表的最左邊位置 left = 0

最右邊位置 right = len(l1) - 1

中間位置 mid = (left+right) // 2

開始查找

x 和 中間位置的元素做比較, if x == l1[mid]

如果相等,break 結束。

如果 x 更大,下次只需要查找 mid 右邊的元素,也就是 left = mid +1

反之 right = mid - 1

使用「二分查找」,只用了 0.0006 秒不到!

選擇排序

現實生活中,數據往往是無序的。而我們又時時刻刻都在查找。

所以,想辦法將無序的數據變得有序,從而可以使用「二分查找」就變得非常重要!

給定一個如下的無序列表,如何對它進行排序呢?

import random

list1 = random.sample(range(0,100),9)

問題看上去很簡單。

先找到最小的,放到第1位

再找到次小的,放到第2位

……

這種排序方法被稱為「選擇排序」。

雖然選擇排序看上去很容易理解,並且網上還有無數的解釋教程,甚至還做了像下面這樣形象生動的gif動畫。

但初學者依然很難寫出正確的程序。一個重要的原因是不能真正理解電腦的工作方式。

如果有條件的話,可以找9個盒子,裝入9個不同的數字紙片。

上一篇介紹過,這種方式非常接近列表在電腦裡的真實狀態。

然後實際動手模擬選擇排序的過程,這種方式將非常有助於理解電腦的工作方式,理解選擇排序的程序代碼。

下一篇,我們將詳細介紹這個過程,及對應的程序。

在模擬過程中,要注意的是:

只有拉開盒子,才能看到盒子裡的數字。並且去拉另一個盒子前,要把當前盒子重新關上。不能挪動盒子,只能把盒子裡的數字紙片拿出來交換位置。

相關焦點

  • 漫畫:什麼是二分查找?(修訂版)
    第二次我們選擇250,發現還是偏大了,那麼下一次的選擇範圍,就變成了1到249:第三次我們選擇125,發現偏小了,那麼下一次的選擇範圍,就變成了126到249:以此類推,最壞的情況需要猜測多少次呢?答案是 log1000 = 10次,也就是讓原本的區間範圍進行10次 「折半」。剛才我們所分析的是猜數字的遊戲。
  • 地球連續13次收到宇宙信號,距地球15億光年,外星人在打招呼?
    2020-12-31 12:55:24 來源: 史之事 舉報
  • 13個月內四次減持!完美世界董事長套現25.87億
    來源:投資時報增發股份解禁後,完美世界董事長池宇峰便開始了減持計劃,短短13個月時間裡,其已減持4次套現近26億元《投資時報》研究員 時雨在國內遊戲圈,也曾有過一個能與騰訊2015年1月2日,完美世界宣布,收到公司董事長池宇峰於2014年12月31日發出的每股20美元的私有化提議。2016年1月完美環球發布公告,擬作價120億元收購實際控制人池宇峰旗下著名遊戲公司完美世界100%股權。這也意味著完美集團旗下最優質的遊戲業務回歸A股。值得注意的是,完美世界回歸後增值速度飛快,市盈率立刻由美股時的10倍變為A股增發時的40倍左右。
  • 一張紙最多摺疊8次?她把紙摺疊了13次後,發生了什麼?
    A4紙摺疊51次後,會到達太陽表面?你先摺疊夠8次再說吧!紙張是再普通不過的了,可以用它來寫字,也可以用來摺紙。在近日網絡上就流傳著這樣的說法,一張紙是不可以摺疊超過7次的。在摺疊第7次的時候就已經非常費力地,想要完成第8次是幾乎不可能的,這裡的指的是a4紙,而並不是經過特殊材料製作的紙張。那麼一張紙最多可以摺疊多少次呢?
  • 《模擬人生》系列20周年趣味數據 遊戲中嘿咻數超13億次
    原標題:《模擬人生》系列20周年趣味數據遊戲中嘿咻數超13億次來源:3DMGame 今日(2月5日),《模擬人生》系列迎來了自己的20周年,官方除了推出一系列「限量版生日收藏品」之外,還給每一位玩家提供了一個特殊的免費遊戲內物品——生日熱水浴缸
  • 3分鐘橫穿馬路13次!這個「熊孩子」被撞到了
    橫穿馬路一次已經不得了竟有熊孩子在馬路上來來回回地跑著玩短短3分鐘就來回橫穿了13次最終悲劇果然發生了5月7日,安徽銅陵樅陽縣兩名男孩在城區主幹道上奔跑玩鬧3分鐘來回橫穿馬路13次!最終一輛路過的轎車避讓不及將其中一6歲男童撞倒隨後男童被送往醫院治療所幸暫無生命危險目前,仍在醫院觀察治療中據銅陵公安介紹事發時家長在路邊屋內沒有注意到孩子的危險舉動看到這裡網友憤怒不已這不是車撞孩子,而是孩子撞車啊▼▼
  • 從膠片轉戰製藥業的柯達,股價一夜熔斷13次
    7月29日,柯達公司在官網宣布已獲得美國政府7.65億美元,約合54億元的貸款,這筆錢將用於建設醫療藥物工廠。換言之,膠片巨頭柯達要轉戰製藥業了。從柯達的發展史來看,其實這次的轉型也並沒有什麼可驚奇的。原來早在1988年,柯達曾收購過Sterling Drug Inc.,使柯達具備了成為處方藥與非處方藥的盈利參與者所需的基礎和營銷能力。
  • 13次直播賣掉476億,曹德旺:她太美了
    不過,現在在直播行業,如果把以上的這些人和「她」比起來,簡直是「小巫見大巫」,「她」也被稱為「新晉帶貨王」,它僅直播了13次,就賣出了476億的銷售額,就連中國的首善曹德旺也不止一次地稱讚她,「她」就是格力集團董事長董明珠。我國是空調製造大國,格力在我國空調市場一直處於領先地位,也成為市場認可的產品。
  • 單曲最高收聽13.7億次,破億單曲11首!這就是歌王華晨宇的底氣嗎
    單曲最高收聽13.7億次,破億單曲11首!」,並表示這數據,換誰都想在家多呆呆吧。華晨宇的單曲《煙火裡的塵埃》的收聽人數達到了13.7億人次,平均每個中國人都聽一次了,更何況還有11首破億的單曲,這個數據是真的牛!當然,就華晨宇本人而言,他的閉關肯定不是因為這樣的成績而放鬆,更多的是為了調整一下作息,然後在家靜下心創作,而且他往年也會選擇閉關一段時間。
  • 連續13次,全國唯一!
    連續13次,全國唯一!長沙再次榮獲「中國最具幸福感城市」稱號,這也是長沙連續13年獲此殊榮。長沙縣入選「2020中國最具幸福感城市(縣級市)」及「2020企業家幸福感最強市(區)」。>據悉,「中國最具幸福感城市」調查推選活動由新華社《瞭望東方周刊》、瞭望智庫共同主辦,是目前中國極具影響力和公信力的城市調查推選活動,全國累計約10億人次參與調查,使得「城市幸福感
  • 【聚焦京阿尼】13天收到13億日元捐款,京阿尼發中文致謝信
    (京都Animation作品《涼宮春日的憂鬱》) 13天收到13億日元捐款 7月18日縱火事件當天,7月24日,京阿尼官方也公布了接受全球捐款的銀行帳戶信息。 另外,京阿尼在官方推特上發布,原定於日本時間9月6日上映的《紫羅蘭秘密花園》電影版將如期上映,並將原本兩周的上映期間延長到了三周。對於粉絲來,這也是個十分振奮人心的好消息了。
  • 首付 3066 元 跟一個面對非洲雄獅 13 次的傢伙去肯亞
    Jerry Xu 今年正打算第 14 次進入肯亞腹地拍攝動物大遷徙。對他來說,這個行程正漸漸變成他最熟悉的生活。 Jerry 第一次到肯亞是 28 歲。他想帶著大家去看野生動物,將自己十幾次肯亞之旅的經歷與每一個同行的朋友分享。他希望,他能讓大家像他一樣愛上這個神奇的國度,愛上這些神奇的動物。 Jerry 就像是準備了一顆關於肯亞的時間膠囊,等著與朋友們一起打開。
  • MELON實時一位《IF YOU》累計破表13次
    MELON實時一位《IF YOU》累計破表13次。二位《SOBER》累計破表七次。GENIE實時一位《IF YOU》累計破表14次。二位《SOBER》累計破表12次。韓國時間13:30。《IF YOU》總榜實時1位。四榜日榜一位八榜實時AK。《SOBER》總榜實時3位。三榜日榜二位,八榜實時二位AK。
  • 人類連續收到13次來自15億光年外的電波,劉慈欣:不要回答
    而劉慈欣用了6次不要回答。但是我們還是回答!最終,留給地球的時間只剩下400年。當大家都認為這只是出現在小說當中之時,然而,它卻發生在了現實當中!加拿大的一架望遠鏡在兩個月內,捕獲到13個快速射電暴,其中有一個很不同尋常的重複電波,這個電波來自15億光年外。科學家紛紛表示,不能排除這些電波來組於一艘外星飛船。
  • 柯達一夜熔斷13次,曾經的膠捲大王能靠當藥神東山再起嗎?
    近日,柯達獲美政府7.65億美元貸款用於仿製藥生產,其中包括曾被川普吹噓能用於治療冠狀病毒的抗瘧疾藥「羥氯喹」。這一消息也直接點燃了柯達的股價。北京時間7月29日晚,在前一交易日股價暴漲203%的情況下,柯達再度大幅高開,隨後盤中更是加速上漲,最高漲幅一度達655%,股價最高報59.98美元,向上觸發熔斷多達10次。
  • 別讓正常心跳每分鐘超過100次,否則你會短命13年
    其中心搏過,只要每分鐘超過100次,就很容易發生猝死,但如果心跳每分鐘低於40次,也不代表你的心肺功能比較強,很可能會慢到心臟突然停止跳動而死亡。 別讓每分鐘心跳超過100次,否則你會少活13年 最健康的心跳,每分鐘應該是在60到69次,但有些人可能因為自律神經的影響而略快或略慢,基本上
  • 9場10球僅用了13次射正!多特4-0沙爾克,哈蘭德傳射建功
    這是19歲的挪威前鋒哈蘭德從冬窗加盟多特以來,在各項賽事12場比賽中打入了13個進球,這也追平了馬蒂沙克在1965年為不萊梅效力時創造的神奇紀錄。有意思的是這也是哈蘭德頭9場德甲比賽打入的第10個進球,而他僅用了13次射正,不得不說哈蘭德是一位高效率的神射手。
  • 落實南海宣言第13次高官會在內蒙古舉行
    2016年8月15日至16日,中國與東協國家在中國內蒙古滿洲裡市舉行了落實《南海各方行為宣言》第13次高官會和第18次聯合工作組會。微博 圖8月15日至16日,中國與東協國家在中國內蒙古滿洲裡市舉行了落實《南海各方行為宣言》第13次高官會和第18次聯合工作組會。本次會議在中國與東協外長會之後、中國與東協領導人會議之前舉行。與會各方就全面有效落實《宣言》以及「南海行為準則」磋商等議題進行了深入探討,取得了積極成果。
  • 原創新帶貨王誕生了,一年才直播13次卻帶貨476億,目前身家高達59億
    辛巴失事以後,一個新的帶貨王就發現了,這片面一年才直播了13次,不過卻勝利帶貨476億,這片面真相誰呢?曹德旺已經是評估這個直播帶貨王長得太絢麗了。這片面實在即是格力的董事長董明珠。董明珠是著名的商界女強人。看到今年董明珠的闡揚,你就曉得這個女人勝利真的不是偶而的。疫情產生以後,董明珠為了變更販賣計謀,踴躍上網直播,擁抱這個變更。
  • BLACKPINK MV點擊量破13億,K-Pop組合最初
    BLACKPINK《DDU-DU DDU-DU》MV點擊量破13億,K-Pop組合最初,9月6日,據YG Ent.方面表示,BLACKPINK《DDU-DU DDU-DU》MV於韓國時間5日晚10時15分左右在YouTube的點擊量突破了13億次。