【问题标题】:binary search using for loop in javascript在javascript中使用for循环进行二分搜索
【发布时间】:2021-10-16 01:56:02
【问题描述】:

我正在尝试在 javascript 中使用 for 循环实现二进制搜索,但它失败了一些测试用例,下面是我的代码

function binarySearch(arr, val){
    let start = 0
    let end = arr.length - 1
    let middle = Math.floor((start + end)/2)

    for(let i = start; i<= end; i++){
        if(val === arr[middle]) { 
           return middle
        }

        if(val < arr[middle]){
            end = middle - 1
        }

        if(val > arr[middle]){
           start = middle + 1
        }

        middle = Math.floor((start + end)/2)
    }
        return -1
  }

    // test case:1 console.log(binarySearch([5, 6, 9, 10, 13, 14, 18, 30, 34, 35, 37, 40, 44, 64, 79, 84, 86, 95, 96, 98, 99], 9))
    
    
   // test case:2 console.log(binarySearch([1,3,4,5,6,7,8,9, 10], 10))

它通过了第二个测试用例,但悲惨地失败了第一个测试用例。有谁能给点灯吗?

【问题讨论】:

  • 看来您有错字。 val &gt; middle 应该是 val &gt; arr[middle]
  • if(val &gt; middle)?
  • @Ouroborus 虽然您的建议是正确的,但问题仍然存在。我意识到在这种情况下为什么不使用“for循环”。这是因为在循环内部我分配了一个新值,但是当您意识到“i”的值保持与最初初始化的起始值相同时,就会出现问题。 i

标签: javascript algorithm data-structures binary-search


【解决方案1】:

就像你说的 Nishant,While 循环在这种情况下是合适的,因为你应该更新循环内的左(开始)、右(结束)和中间索引的值。

二分查找的迭代实现(Java):

public int binarySearch(int[] array, int target) {
    var left = 0;
    var right = array.length - 1;

    while (left <= right) { 
        var middle = (left + right) / 2;

        if (array[middle] == target)
            return middle;

        if (target < array[middle]) 
            right = middle - 1;
        else
            left = middle + 1;
    }

    return -1;
}

【讨论】:

    【解决方案2】:

    我意识到在这种情况下为什么不使用“for循环”。

    这是因为在循环中我为“start”分配了一个新值,但是当您发现“i”的值与之前初始化的“start”值相同时就会出现问题。

    同样的情况发生在 i

    我的意思是“i”没有被重新分配除 i++ 之外的任何东西。我已经意识到,在这些情况下,最好使用 while 循环迭代而不是 for 循环,因为您需要从循环内部重新初始化索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多