啊哈,演算法之二分思想

2021-04-12 16:04:36 字數 1494 閱讀 2604

學過資料結構的人都應該知道二分查詢演算法,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

intisfind(

double

low  ,

double

high,

double

parent)

double

sqrtofnum(

double

number)

}int

main ()

演算法之二分查詢

總時間限制 1000ms 記憶體限制 65536kb 描述在乙個非降序列中,查詢與給定值最接近的元素。輸入第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數...

演算法之二分查詢

二分查詢演算法是運用分治策略的典型例子。給定一組已經排好序的n個元素a n 從這n個元素中找到乙個特定元素x。基本思想 將n 個元素劃分成個數大致相同的兩部分,取中間元素a n 2 與x進行比較 如果x a n 2 即找到x,演算法終止 如果x如果x a n 2 則只在陣列a的右半部分繼續查詢x。c...

演算法之二分查詢

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想,每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到想要查詢的元素,或是區間被縮小為0。二分查詢的時間複雜度為o l ogn o logn o logn l og nlogn logn 是乙個非常恐怖的數量級,即使n非...