我有一个排序数字数组和一个起始值。为简单起见,假设数组的值为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();
答案 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;
}
}