例題:設計乙個函式,接收乙個有序陣列和乙個元素,如果指定的元素包含在陣列中,則返回其位置。
看見這道題,我們正常的想法為遍歷陣列的所有元素然後乙個乙個的與數值相比較,如果相等,返回索引,如果在迴圈執行完後沒有退出函式的話,就返回false。**為
var count=0;
//計數
function
lookup
(arra, a)
}return
false
;//不存在 返回false
} console.
log(
lookup([
1,2,
3,4,
5,6,
7,8,
9],9
)); console.
log(
'**執行的次數為'
+count)
;
執行結果如下
上面的查詢方法為簡單查詢,如果在最糟糕的情況下,即元素在最後乙個,那麼9個數你要執行9次,100個數你要執行100次,10億個數要執行10億次。假設**執行一次需要1s,10億次,就是10億秒,效率極其低下。那麼下面我們介紹乙個更佳的查詢方式,即二分查詢法。
二分查詢法,顧名思義,二分即一分為二,假設有100個數,我們先找到索引為50的元素,然後與要找的元素做比較,如果它大於索引為50的元素,那麼我們就排除了索引為50前面的元素,因為我們是乙個有序陣列,然後我們在找索引為75的元素進行判斷,因為75為50到100中間的數,然後以此類推。**為
var count=0;
//計數
function
lookup
(arra, x)
if(arra[middle]
< x)
if(arra[middle]
> x)
}return
false;}
console.
log(
lookup([
1,2,
3,4,
5,6,
7,8,
9],9
)); console.
log(
'**執行的次數為'
+ count)
;
執行結果如下
執行結果圖示
根據結果可以看出同樣的9個數簡單查詢需要9次,但二分查詢只需要4次,不要以為只少了5次。具體請看下表簡單查詢
執行次數
1010
100100
40億40億
二分查詢
執行次數104
1007
40億32
看到區別了嗎,隨著元素個數的增加,二分查詢需要的額外時間並不多,而簡單查詢需要的額外時間很多。用大o表示法來表示的話,簡單查詢的執行時間為o(n),而二分查詢的執行時間為o(log n)
大o表示法指出的是最糟糕情況下的執行時間
查詢演算法 二分查詢法
二分查詢法是經典的入門演算法,以高效和廣泛應用而著稱.演算法是由靜態方法rank 實現的,它接受乙個整數鍵和乙個已經有序的int 陣列作為引數。如果該鍵存在於陣列中 則返回它的索引,否則返回 1。演算法使用兩個變數low 和high,並保證如果鍵在陣列中則它一定在 a low high 中,然後方法...
二分查詢演算法c語言 演算法總結 二分查詢法
在leetcode的題目討論中,經常會有些大神將某一類的題目結題思路給整理了出來,感覺受益匪淺。受之啟發,萌生了自己也總結一下常見演算法的解題思路的想法,希望可以讓自己在這個總結的過程中可也融匯貫通這些思路,同時可以給後來者以啟發。從 開始好呢?就從經典的二分查詢法開始吧,這個演算法幾乎所有學過計算...
演算法之二分查詢法
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後...