【问题标题】:Why can't my algorithm find the index in my array?为什么我的算法在我的数组中找不到索引?
【发布时间】:2018-06-15 00:27:45
【问题描述】:

为什么我的算法返回“-1”意味着目标值 73 不在数组中? (当明显 73 在数组中时)。 [这是来自可汗学院,但没有帮助]

它应该返回数组中位置的索引, 如果数组不包含目标值,则为“-1”

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

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
    41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);

【问题讨论】:

  • guess = floor 你能发布你的floor 函数吗? (假设它不同于Math.floor
  • max*1min*1有什么意义。乘以 1 不会改变数字。
  • 你已经在你的代码中指定了“return -1”
  • 你甚至没有遍历数组。您的函数将始终返回 -1。
  • @HoCo_ 你可能错过了另一个return 声明。我已经对问题进行了格式化以使其更清晰

标签: javascript binary-search khan-academy


【解决方案1】:

您将guess 设置为数组索引,但随后您将其与targetValue 进行比较。您需要比较该索引处的数组元素。

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

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
  41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
];

var result = doSearch(primes, 73);
console.log("Found prime at index " + result);

【讨论】:

    【解决方案2】:

    您的函数doSearch() 不会将array 的任何值与targetValue 进行比较。您需要访问guess 位置并进行比较,如下所示:

    var doSearch = function(array, targetValue) {
        var min = 0;
        var max = array.length - 1;
        var guess;
        while(max >= min){
            guess = Math.floor((max*1 + min*1) / 2);
            if (array[guess] === targetValue) {
                return guess;
            } else if (array[guess] < targetValue) {
                min = guess + 1;
            } else {
                max = guess - 1;
            }
        }
        return -1;
    };
    
    var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
    41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
    
    var result = doSearch(primes, 73);
    console.log("Found prime at index " + result);

    警告: JavaScript 中不存在 floor() 函数。你应该使用Math.floor()。另外,函数println()。请改用console.log()

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      相关资源
      最近更新 更多