math - Implementing binary search with tolerance in JavaScript? -
i'm trying find number between min , max. know (through using more method) whether number i'm guessing higher or lower number passed. number need find can decimal, making me nervous, average binary search seems concern business of integers.
the algorithm i've written attempt @ binary search, without array. difference, see it, between classical binary search values , index of search have been conflated same task.
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> my question this; given want do, can code improved upon? or perhaps there better way of doing together? obviously, number of tries improved increasing tolerance - it's @ expense of accuracy of final result. example, make sense me increase tolerance after number of tries?
also, how best 1 go ensuring needed number in range? know ensure !more(max) && more(min) before attempting while loop, there more efficient way bolting on 2 checks @ beginning of script?
it's hard better binary search searching number in range.
assuming range know/similar, validation can done before search() function either use of more() function or clamp function. see link clamp number
if range can change dramatically, kind of exponential function used find 'the range'.
- range 0-100
- range 101 1000
- range 1001 20000
- etc.
you considerate setting tolerance percentage, or number of 'good decimals'. see here
know same efficacity while searching number x decimals (ie. 123.45 in range 0 1000) , while searching 12345 in range 0 100 000.
since 'worst case scenario' number of tries ⌈log2(n+1)⌉. having 100 tries allows find number precisely in range of 0 n = 1267650600228229401496703205375. since have decimals, every decimal of precision desire, need divide number 10.
a 0.xxxxxx precision leave 0 12676506002282294014967032 range in find number in less 100 tries.
if calculations correct..
Comments
Post a Comment