二分查詢之一 收藏

2021-05-05 00:32:03 字數 1419 閱讀 5108

學過資料結構的人都應該知道二分查詢演算法,n個資料線性查詢不不得花費(n/2)的時間,而二分查詢可以在log(n)次數內完成,在對巨量的資料進行處理的時候,這種方法應該是神來之筆!其實在我門生活中無處不存在二分思想到處可見,記得有個猜資料的遊戲,告訴你 數字的範圍,讓你在規定的次數內將資料猜出,比如1000以內的資料,你肯定首先會猜500,別人說底了,你肯定又會說250.......如果n=1000最多猜10次就可以猜到資料!

下面引入程式設計珠璣第二章的第乙個問題:

給定乙個包含32位整數的順序檔案,你至多只能夠包含40億個這樣的數字,並且整數的次序是隨機的,請查詢乙個此檔案中不存在的32位整數(至少必有乙個遺漏,為什麼?)在有足夠的主存情況下,你會如何解決?如果你可以使用若干外部臨時檔案但主存卻只有百位元組,你會如何處理這個問題?

首先解決這個問題: 至少必有乙個遺漏,為什麼,很容易(pow(2,32) > 40億的,所以肯定是有遺漏!

首先我不引入他的演算法,我首先將問題簡化,假定乙個範圍內的數n個數,現在有n-1個數,而且不重複,要你找出這個數.我會有幾種想法

1 將n-1個數進行排序,然後一一對照,直到找到不對應的為止

2 將這個範圍內的數想加減去那n-1個數的和

在n很小的時候,而且記憶體足夠的情況下,1,2方法都是可以的,特別是2可以在o(n)的時間內找到,但是對於作者提出的問題就顯得很無奈了1進行排序的時間太長,查詢的時間也很長 2雖然不要進行排序,也不要進行比較但是當資料很大的時候,必須自己寫超精度的加減法,時間和空間複雜度都會增加,在有幾個臨時檔案,幾百個位元組的條件下似乎很難找到時間和空間都滿意的方法,看看作者怎麼做的把!

"我們應該使用乙個至少包含乙個遺漏資料的序列作為範圍,實際上我們是使用包含所有整數的檔案來表示範圍 .關鍵在於我們可以通過計數中點上下元素個數的方法來探測某一範圍;上下範圍至多包含總範圍內的元素的一半.因為總範圍有乙個元素遺漏,所以較小的一半範圍內必定包含遺漏元素.這些就是對二分查詢演算法的大部分要素."

其實二分思想在程式設計應用方面是很廣的,求根程式使用的是二分查詢,通過連續插入中間值的方式求解一元方程;她的其他用法還有樹資料結構以及程式除錯.從這些例子中的每乙個都可以看出,可將每個程式看作是對基本二分法的潤色.這樣就為我們程式設計師提供了一種"萬金油"演算法.

以前看書看過人工神經網路是"萬金油",今天又碰到了乙個"萬金油"演算法.可見他的應用之廣和作用之大,博大啊!

下面是我用二分演算法得到的求數的平方根的**:

#include " stdio.h "

#include " stdlib.h "

#include " math.h "

#define  errornum 10e-7

int  isfind( double  low  , double  high, double  parent)

double  sqrtofnum( double  number)

}int  main ()

每對頂點間的最短路徑之一 收藏

這裡給出的是基於動態規劃方法,時間複雜度時o v 4 可以通過 重複平方 計數使其複雜度降低位o v 3 lgv 參考 演算法導論 25.1 view plaincopy to clipboardprint?include using namespace std const int n 5 cons...

二分查詢(一)

在演算法題目中,很重要的乙個就是邊界條件的設定,需要我們去明確,變數代表的含義,在迴圈的過程中一直保證此變數的含義不發生變化。含義不發生變化,而非變數值。class binaryclass system.out.println binarysearch2 arr,arr.length,4 publi...

二分查詢(一)

二分查詢 1.首先找到列表中排在中間的元素,比較目標元素與該元素的大小,如果中間的元素等於目標元素,則返回true,否則返回false 2.如果目標元素比該元素大,則在中間元素與最後乙個元素之間重複步驟1 在中間元素右邊進行查詢目標元素 3.如果目標元素比該元素小,則在中間元素與第乙個元素之間重複步...