算法:以最快的方式查找附近的值

时间:2018-04-30 16:24:44

标签: javascript node.js algorithm optimization

我有一个排序数字数组和一个起始值。为简单起见,假设数组的值为1到20,起始值为10.

要查找的值可以根据用户输入每5秒更改一次。它可以增加或减少,并且始终保持在表格的值范围内。

我唯一不知道的是价值是增加还是减少。我已经提出了下面的(非常)简单算法。

你能想出改善它的方法吗? 理想情况下,我认为最好的方法是同时运行两个for循环并在找到值时返回...例如使用worker? 在我的例子中,“up up”for循环在“up up”开始运行之前已经耗尽。理想情况下,不应该发生这种情况,因为我每次都试图传播-1 / + 1次尝试。

顺便说一句:我之所以这样做是因为我必须在for循环中运行相当繁重的函数。代码在node.js上下文中运行。

Here's a JSFiddle and the code below

const attempts = document.getElementById('attempts');
let attemptsCount = Number(attempts.textContent);
const lastValue = 10;
const valueToFind = 16; //this must be found in the least possible number of attempts
const table = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

const lookup = () => {
    for (var i = lastValue; i > 0; i--) {
    if (table[i] == valueToFind) {
        alert('Found going down');
      return;
    } else {
    attemptsCount++;
    attempts.textContent = attemptsCount;
    }
  }

  for (var i = lastValue; i < table[table.length-1]; i++) {
    if (table[i] == valueToFind) {
        alert('Found going up');
      return;
    } else {
    attemptsCount++;
    attempts.textContent = attemptsCount;
    }
  }
}

//find new value
lookup();

1 个答案:

答案 0 :(得分:1)

现在,你所拥有的每个for循环都会彼此异步运行...所以一方总是在另一方开始之前完成......这是不理想的。

请记住,for循环设置为初始化,检查bool语句是否为true,并设置下一步...所以像if语句一样,您可以在每个场景中实现多个语句。

减少循环尝试可以很简单,因为它同时执行:

const lookup = () => {
    for (var up = lastValue, down = lastValue-1; up < table[table.length-1] || down > 0; up++, down--) {
    if (up < table[table.length-1] && table[up] == valueToFind) {
        alert('Found going up');
      return;
    } else if (down > 0 && table[down] == valueToFind) {
        alert('Found going down');
      return;
    } else {
        attemptsCount++;
        attempts.textContent = attemptsCount;
    }
  }

Your JSFiddle updated