<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手教你用Python實(shí)現(xiàn)查找算法

          共 609字,需瀏覽 2分鐘

           ·

          2021-12-14 02:39

          導(dǎo)讀:在復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中高效地查找數(shù)據(jù)是其非常重要的功能之一。最簡(jiǎn)單的方法是在每個(gè)數(shù)據(jù)點(diǎn)中查找所需數(shù)據(jù),效率并不高。因此隨著數(shù)據(jù)規(guī)模的增加,我們需要設(shè)計(jì)更復(fù)雜的算法來查找數(shù)據(jù)。


          作者:伊姆蘭·艾哈邁德(Imran Ahmad)
          來源:大數(shù)據(jù)DT(ID:hzdashuju)




          本文介紹以下查找算法:

          • 線性查找(Linear Search)
          • 二分查找(Binary Search)
          • 插值查找(Interpolation Search)

          我們?cè)敿?xì)了解一下它們各自的情況。


          01?線性查找

          查找數(shù)據(jù)的最簡(jiǎn)單策略就是線性查找,它簡(jiǎn)單地遍歷每個(gè)元素以尋找目標(biāo),訪問每個(gè)數(shù)據(jù)點(diǎn)從而查找匹配項(xiàng),找到匹配項(xiàng)后,返回結(jié)果,算法退出循環(huán),否則,算法將繼續(xù)查找,直到到達(dá)數(shù)據(jù)末尾。線性查找的明顯缺點(diǎn)是,由于固有的窮舉搜索,它非常慢。它的優(yōu)點(diǎn)是無須像其他算法那樣,需要數(shù)據(jù)排好序。

          我們看一下線性查找的代碼:


          def?LinearSearch(list,?item):
          ????index?=?0
          ????found?=?False

          #?Match?the?value?with?each?data?element???????
          ????while?index?and?found?is?False:
          ????????if?list[index]?==?item:
          ????????????found?=?True
          ????????else:
          ????????????index?=?index?+?1
          ????return?found


          現(xiàn)在,看一下代碼的輸出(見圖3-15)。


          list?=?[12,?33,?11,?99,?22,?55,?90]
          print(LinearSearch(list,?12))
          print(LinearSearch(list,?91))

          ▲圖 3-15

          需要注意的是,如果能成功找到數(shù)據(jù),運(yùn)行LinearSearch函數(shù)會(huì)返回True。

          • 線性查找的性能:如上所述,線性查找是一種執(zhí)行窮舉搜索的簡(jiǎn)單算法,其最壞時(shí)間復(fù)雜度是O(N)。


          02 二分查找

          二分查找算法的前提條件是數(shù)據(jù)有序。算法反復(fù)地將當(dāng)前列表分成兩部分,跟蹤最低和最高的兩個(gè)索引,直到找到它要找的值為止:


          def?BinarySearch(list,?item):
          ????first?=?0
          ????last?=?len(list)-1
          ????found?=?False

          ????while?first<=last?and?not?found:
          ????????midpoint?=?(first?+?last)//2
          ????????if?list[midpoint]?==?item:
          ????????????found?=?True
          ????????else:
          ????????????if?item?????????????????last?=?midpoint-1
          ????????????else:
          ????????????????first?=?midpoint+1
          ????return?found


          輸出結(jié)果如圖3-16所示。


          list?=?[12,?33,?11,?99,?22,?55,?90]
          sorted_list?=?BubbleSort(list)
          print(BinarySearch(list,?12))
          print(BinarySearch(list,?91))


          ▲圖 3-16

          請(qǐng)注意,如果在輸入列表中找到了值,調(diào)用BinarySearch函數(shù)將返回True。

          • 二分查找的性能:二分查找之所以如此命名,是因?yàn)樵诿看蔚校惴ǘ紩?huì)將數(shù)據(jù)分成兩部分。如果數(shù)據(jù)有N項(xiàng),則它最多需要O(log N)步來完成迭代,這意味著算法的運(yùn)行時(shí)間為O(log N)。


          03 插值查找

          二分查找的基本邏輯是關(guān)注數(shù)據(jù)的中間部分。插值查找更加復(fù)雜,它使用目標(biāo)值來估計(jì)元素在有序數(shù)組中的大概位置。

          讓我們?cè)囍靡粋€(gè)例子來理解它:假設(shè)我們想在一本英文詞典中搜索一個(gè)單詞,比如單詞river,我們將利用這些信息進(jìn)行插值,并開始查找以字母r開頭的單詞,而不是翻到字典的中間開始查找。一個(gè)更通用的插值查找程序如下所示:


          def?IntPolsearch(list,x?):
          ????idx0?=?0
          ????idxn?=?(len(list)?-?1)
          ????found?=?False
          ????while?idx0?<=?idxn?and?x?>=?list[idx0]?and?x?<=?list[idxn]:

          #?Find?the?mid?point
          ????????mid?=?idx0?+int(((float(idxn?-?idx0)/(?list[idxn]?-?list[idx0]))?*?(?x?-?list[idx0])))

          #?Compare?the?value?at?mid?point?with?search?value?
          ????????if?list[mid]?==?x:
          ????????????found?=?True
          ????????????return?found

          ????????if?list[mid]?????????????idx0?=?mid?+?1
          ????return?found


          輸出結(jié)果如圖3-17所示。


          list?=?[12,?33,?11,?99,?22,?55,?90]
          sorted_list?=?BubbleSort(list)
          print(IntPolsearch(list,?12))
          print(IntPolsearch(list,91))

          ▲圖 3-17

          請(qǐng)注意,在使用IntPolsearch函數(shù)之前,首先需要使用排序算法對(duì)數(shù)組進(jìn)行排序。

          • 插值查找的性能:如果數(shù)據(jù)分布不均勻,則插值查找算法的性能會(huì)很差,該算法的最壞時(shí)間復(fù)雜度是O(N)。如果數(shù)據(jù)分布得相當(dāng)均勻,則最佳時(shí)間復(fù)雜度是O(log(log N))。

          關(guān)于作者:伊姆蘭·艾哈邁德(Imran Ahmad) 是一名經(jīng)過認(rèn)證的谷歌講師,多年來一直在谷歌和學(xué)習(xí)樹(Learning Tree)任教,主要教授Python、機(jī)器學(xué)習(xí)、算法、大數(shù)據(jù)和深度學(xué)習(xí)。他在攻讀博士學(xué)位期間基于線性規(guī)劃方法提出了名為ATSRA的新算法,用于云計(jì)算環(huán)境中資源的優(yōu)化分配。近4年來,他一直在加拿大聯(lián)邦政府的高級(jí)分析實(shí)驗(yàn)室參與一個(gè)備受關(guān)注的機(jī)器學(xué)習(xí)項(xiàng)目。

          本文摘編自程序員必會(huì)的40種算法》,經(jīng)出版方授權(quán)發(fā)布。

          延伸閱讀程序員必會(huì)的40種算法

          推薦語:本書致力于利用算法求解實(shí)際問題,幫助初學(xué)者理解算法背后的邏輯和數(shù)學(xué)知識(shí)。本書內(nèi)容豐富,涉及算法基礎(chǔ)、設(shè)計(jì)技術(shù)、分析方法、排序算法、查找算法、圖算法、線性規(guī)劃算法、機(jī)器學(xué)習(xí)算法、推薦算法、數(shù)據(jù)算法、密碼算法和并行算法等內(nèi)容,重點(diǎn)講述如何使用Python進(jìn)行算法實(shí)現(xiàn)和算法性能的比較與分析。


          刷刷視頻??


          干貨直達(dá)??



          更多精彩??

          在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          讀書?|?書單?|?干貨?|?講明白?|?神操作?|?手把手
          大數(shù)據(jù)?|?云計(jì)算?|?數(shù)據(jù)庫(kù)?|?Python?|?爬蟲?|?可視化
          AI?|?人工智能?|?機(jī)器學(xué)習(xí)?|?深度學(xué)習(xí)?|?NLP
          5G?|?中臺(tái)?|?用戶畫像?|?數(shù)學(xué)?|?算法?|?數(shù)字孿生

          據(jù)統(tǒng)計(jì),99%的大咖都關(guān)注了這個(gè)公眾號(hào)
          ??
          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三四区五区视频 | 亚洲五月丁香婷婷 | 亚洲中文字幕视频在线观看 | 成人网站在线看 | 三级片在线视频 |