日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《编程珠玑(第2版•修订版)》—第2章2.2节无处不在的二分搜索

發(fā)布時間:2023/12/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《编程珠玑(第2版•修订版)》—第2章2.2节无处不在的二分搜索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)書摘來自異步社區(qū)《編程珠璣(第2版?修訂版)》一書中的第2章2.2節(jié)無處不在的二分搜索,作者【美】Jon Bentley,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號查看。

2.2 無處不在的二分搜索
我想到的一個數(shù)在1到100之間,你來猜猜看。50?太小了。75?太大了。如此,游戲進行下去,直到你猜中我想到的數(shù)為止。如果我的整數(shù)位于1到n之間,那么你可以在log2n次之內(nèi)猜中。如果n是1 000,10次就可以完成;如果n是100萬,則最多20次就可以完成。

這個例子引出了一項可以解決眾多編程問題的技術:二分搜索。初始條件是已知一個對象存在于一個給定的范圍內(nèi),而一次探測操作可以告訴我們該對象是否低于、等于或高于給定的位置。二分搜索通過重復探測當前范圍的中點來定位對象。如果一次探測沒有找到該對象,那么我們將當前范圍減半,然后繼續(xù)下一次探測。當找到所需要的對象或范圍為空時停止。

在程序設計中二分搜索最常見的應用是在有序數(shù)組中搜索元素。在查找項50時,算法進行如下探測。

眾所周知,二分搜索程序要正確運行很困難。在第4章中我們將詳細研究其代碼。

順序搜索在搜索一個具有n個元素的表時,平均需要進行n/2次比較,而二分搜索僅僅進行不超過log2n次的比較就可以完成。這在系統(tǒng)性能上會造成巨大的差異。下面的故事來自于《ACM通訊》的實例研究“TWA Reservation System”。

我們有一個執(zhí)行線性搜索的程序,可以在1秒鐘內(nèi)對一塊非常巨大的內(nèi)存塊完成100次搜索。隨著網(wǎng)絡的增長,處理每條消息所需的平均CPU時間上升了0.3毫秒,這對我們來說是巨大的變化。我們發(fā)現(xiàn)問題的根源是線性搜索。把程序改為使用二分搜索以后,該問題消失了。
我在許多系統(tǒng)中也遇到過相同的問題。程序員在開始的時候使用簡單的順序搜索數(shù)據(jù)結構,這在開始的時候通常都足夠快。當搜索變得太慢的時候,對表進行排序并使用二分搜索通常可以消除瓶頸。

但是二分搜索的故事并沒有在快速搜索有序數(shù)組這里終止。Roy Weil將該技術應用于清理一個約1000行的輸入文件,其中僅包含一個錯誤行。很不幸,肉眼看不出錯誤行。只能通過在程序中運行文件的一個(起始)部分并且觀察到離奇錯誤的答案來辨別,這將會花費幾分鐘的時間。他的前任調(diào)試人員試圖通過每次運行整個程序中的少數(shù)幾行程序來找出錯誤行,但只在取得解決方案的道路上前進了一點點。Weil是如何僅僅運行10次程序就找到罪魁禍首的呢?

經(jīng)過前面的熱身,我們現(xiàn)在來攻克問題A。輸入為順序文件(考慮磁帶或磁盤——雖然磁盤可以隨機讀寫,但是從頭至尾讀取文件通常會快得多)。文件包含最多40億個隨機排列的32位整數(shù),而我們需要找出一個不存在于該文件中的32位整數(shù)。(至少缺少一個整數(shù),因為一共有232也就是4 294 967 296個這樣的整數(shù)。)如果有足夠的內(nèi)存,可以采用第1章中介紹的位圖技術,使用536 870 912個8位字節(jié)形成位圖來表示已看到的整數(shù)。然而,該問題還問到在僅有幾百個字節(jié)內(nèi)存和幾個稀疏順序文件的情況下如何找到缺失的整數(shù)?為了采用二分搜索技術,就必須定義一個范圍、在該范圍內(nèi)表示元素的方式以及用來確定哪一半范圍存在缺失整數(shù)的探測方法。如何來實現(xiàn)呢?

我們采用已知包含至少一個缺失元素的一系列整數(shù)作為范圍,并使用包含所有這些整數(shù)在內(nèi)的文件表示這個范圍。靈機一動的結果是通過統(tǒng)計中間點之上和之下的元素來探測范圍:或者上面或者下面的范圍具有至多全部范圍的一半元素。由于整個范圍中有一個缺失元素,因此我們所需的那一半范圍中必然也包含缺失的元素。這些就是解決該問題的二分搜索算法所需要的主要想法。在翻閱答案查看Ed Reingold是如何做的以前,請嘗試將這些想法組織起來。

對于二分搜索技術在程序設計中的應用來說,這些應用僅僅是皮毛而已。求根程序使用二分搜索技術,通過連續(xù)地對分區(qū)間來求解單變量方程式(數(shù)值分析家稱之為對分法)。當答案11.9中的選擇算法區(qū)分出一個隨機元素以后,就對該元素一側的所有元素遞歸地調(diào)用自身(這是一種隨機二分搜索)。其他使用二分搜索的地方包括樹數(shù)據(jù)結構和程序調(diào)試(當程序沒有任何提示就意外中止時,你會從源代碼中哪一部分開始探測來定位錯誤語句呢?)。在上述的每個例子中,分析程序并對二分搜索算法做些許修改,可以帶給程序員功能強大的啊哈!靈機一動。

總結

以上是生活随笔為你收集整理的《编程珠玑(第2版•修订版)》—第2章2.2节无处不在的二分搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。