我試圖找到min
和max
之間的數字。我只知道(通過使用more
方法)我猜的數字是高於還是低於傳遞的數字。我需要找到的號碼可以是是一個小數,這是讓我緊張的原因,因爲平均二分查找似乎主要關注整數業務。在JavaScript中使用容差實現二進制搜索?
我寫的算法是一個二進制搜索的嘗試,沒有數組。正如我所看到的,經典二分搜索之間的區別在於,搜索的值和索引已被合併到相同的任務中。
var tolerance = 0;
var tries, min, max, current, needed;
function search() {
tries = 0;
min = 0;
max = 100;
needed = Math.random() * max;
current = (max - min)/2;
while (!accept() && tries < 100) {
if (more(current))
min = current;
else
max = current;
current = min + ((max - min)/2);
tries++;
}
results();
}
function more (n) {
return n < needed;
}
function accept() {
return Math.abs(current-needed) <= tolerance;
}
function results() {
document.getElementById('results').innerHTML = 'accepted: ' + current + '<br>needed: ' + needed + '<br>tries: ' + tries;
}
<button onclick="javascript:search();">search</button>
<br>
<div id="results"></div>
我的問題是這樣的;給我想要做的事,這個代碼可以改進嗎?或者也許有更好的方式一起做這件事?顯然,通過提高容差來大大提高嘗試的次數 - 但這是以犧牲最終結果的準確性爲代價的。例如,在一定次數的嘗試後,增加容忍度對我來說是否合理?
此外,如何最好地確保所需數量在範圍內?我知道我可以在嘗試while
循環之前確保!more(max) && more(min)
,但是有沒有比在腳本的開頭部分簡單地插入兩個額外的檢查更有效的方法?
爲了更好的可讀性,我會將accept函數改爲'Math.abs(current-needed)<= tolerance'。 – Wikunia
@Wikunia你是對的 - 這有點馬虎。 – shennan
可能重複的[JavaScript - 二進制搜索每次都掛起](http://stackoverflow.com/questions/35193520/javascript-binary-search-hangs-every-time) – Rishav