簡體   English   中英

在JavaScript中實現具有容忍度的二進制搜索?

[英]Implementing binary search with tolerance in JavaScript?

我試圖找到介於minmax之間的數字。 我只知道(通過使用more方法)我猜測的數字是大於還是小於傳遞的數字。 我需要查找的數字可以是十進制數,這讓我感到緊張,因為平均二進制搜索似乎主要涉及整數業務。

我編寫的算法是嘗試在沒有數組的情況下進行二進制搜索。 如我所見,經典的二進制搜索之間的區別在於,搜索的值和索引已被合並到同一任務中。

 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) ,但是有沒有比簡單地在腳本開頭附加兩個額外檢查更有效的方法呢?

要搜索范圍內的數字,很難做到比二進制搜索更好。

假設范圍始終是已知的/相似的,則可以在使用search()函數之前使用more()函數或鉗位函數進行驗證。 查看此鏈接夾編號

如果范圍可以急劇變化,則可以使用某種指數函數來查找“良好范圍”。

  • 范圍0-100
  • 范圍101至1000
  • 范圍1001至20000
  • 等等

您也可以考慮將公差設置為百分比或“好小數位數”。 看這里

知道在搜索帶有x個小數的數字(即123.45,范圍為0到1000)和搜索12345,范圍為0到100000時,您將獲得相同的效率。

由於“最壞情況”的嘗試次數為“ log2(n + 1)”。 嘗試100次后,您可以精確找到一個介於0到n = 1267650600228229401496703205375375之間的數字。由於您有小數,因此對於所需的每一個十進制精度,都需要將該數字除以10。

精度為0.xxxxxx將使您的范圍為0到12676506002282294014014967032,您可以在100次嘗試中找到您的數字。

如果我的計算是正確的。

在實際間隔上執行二進制搜索時,無需檢查是否相等,而是可以不斷優化搜索間隔,直到其足夠小為止。

// Generated by CoffeeScript 1.10.0
(function() {
  var eps, hi, lo, mid, more, secret;

  // This is your tolerance value.
  eps = 0.01;

  // The binary search routine will never get to see this.
  secret = 45.63;

  more = function(test) {
    return test > secret;
  };

  lo = 0;

  hi = 100;

  while (hi - lo > eps) {
    mid = lo + ((hi - lo) / 2);
    if (more(mid)) {
      hi = mid;
    } else {
      lo = mid;
    }
  }

  console.log(mid);

}).call(this);

輸出: 45.635986328125


在超出范圍的值上,輸出將等於lohi ,其中equal表示它們的絕對差將小於eps


另請參閱: 對實數進行二進制搜索:Topcoder

 binary_search(lo, hi, p): while we choose not to terminate: mid = lo + (hi-lo)/2 if p(mid) == true: hi = mid else: lo = mid return lo // lo is close to the border between no and yes 

由於實數集很密集,因此應該清楚我們通常無法找到確切的目標值。 但是,我們可以快速找到一些x,使得f(x)在no與yes之間的邊界的一定公差范圍內。 我們有兩種方法決定何時終止:當搜索空間小於某個預定范圍(例如10 ^ -12)或進行固定次數的迭代時終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM