How to implement binary search in JavaScript

后端 未结 4 1510
醉梦人生
醉梦人生 2020-12-21 15:36

https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/p/challenge-binary-search

I was following the pseudo code to implement algorithm on t

相关标签:
4条回答
  • 2020-12-21 15:43

    If anyone is still looking for the answer, you needed to make it (max >= min)

    while (max >= min) {
     guess = Math.floor((max + min) / 2);
     if (array[guess] === targetValue) {
         return guess;
     }
     else if (array[guess] < targetValue) {
         min = guess + 1;
     }
    else {
        max = guess - 1;
        }
    }
    return -1;
    
    0 讨论(0)
  • 2020-12-21 15:50

    To get a value from an array you need to specify a whole number like array[1]. array[1.25] will return undefined in your case.

    To get it working I simply added Math.floor inside you loop to insure we get a whole number.

    EDIT: As @KarelG pointet out you also need to add <= in your while loop. This is for situations where min and max have become the same, in which case guess === max === min. Without the <= the loop would not run in these situations and the function would return -1.

    function (array, targetValue) {
        var min = 0;
        var max = array.length - 1;
        var guess;
    
        while(min <= max) {
            guess = Math.floor((max + min) / 2);
    
            if (array[guess] === targetValue) {
                return guess;
            }
            else if (array[guess] < targetValue) {
                min = guess + 1;
            }
            else {
                max = guess - 1;
            }
    
        }
    
        return -1;
    }
    

    You could use either of Math.floor, Math.ceil, and Math.round.

    I hope this was a small help, I am not very good at explaining, but I'll do my be to elaborate.

    0 讨论(0)
  • 2020-12-21 15:50

    you only have to uncomment the Program.assertEqual like this :

    Program.assertEqual(doSearch(primes, 73), 20);
    

    not like this :

    //Program.assertEqual(doSearch(primes, 73), 20);
    
    0 讨论(0)
  • 2020-12-21 16:05

    In your code when min is equal to max then the loop ends. But in this scenario you are not checking whether array[min] == targetValue

    So changing the code to this will most likely fix your issue

    /* Returns either the index of the location in the array,
      or -1 if the array did not contain the targetValue */
    
        var doSearch = function(array, targetValue) {
        var min = 0;
        var max = array.length - 1;
        var guess;
    
        while(min <= max) {
            guess = Math.floor((max + min) / 2);
    
            if (array[guess] === targetValue) {
                return guess;
            }
            else if (array[guess] < targetValue) {
                min = guess + 1;
            }
            else {
                max = guess - 1;
            }
    
        }
    
        return -1;
    };
    

    JSFiddle Link: http://jsfiddle.net/7zfph6ks/

    Hope it helps.

    PS: Only change in the code is this line: while (min <= max)

    0 讨论(0)
提交回复
热议问题