Мне нужно найти значение двумерного массива и вернуть его индексы. Например, если мой искомый термин находится в массиве [i] [j], я хочу вернуть [i, j].
Естественно, я придумал это простое решение:
function find(str){
for(let o = 0; o < array.length; o++){
for(let k = 0; k < array[o].length; k++){
if(array[o][k] == str){
return [o, k];
}
}
}
}
Теперь мне нужно использовать этот метод пару сотен раз как часть алгоритма, и он становится довольно дорогостоящим. Есть ли более эффективный способ?
Я создал простой полный пример, включающий «тест»:
// setup to hide foo in an array
var array = [];
for(let i = 0; i < 100; i++){
array.push([])
for(let j = 0; j < 100; j++){
if(i == 99 && j == 99) array[i].push("foo"); // intentionally hiding the searched term at the worst-case position for the algorithm of find()
else array[i].push("bar");
}
}
// function to find foo
function find(str){
for(let o = 0; o < array.length; o++){
for(let k = 0; k < array[o].length; k++){
if(array[o][k] == str){
return [o, k];
}
}
}
}
// lets say we need to find foo 200 times
var a = window.performance.now();
for(let i = 0; i < 200; i++){
console.log(i, find("foo")); // if you're happy and you know it, tell us what you found
}
var b = window.performance.now();
// print performance result
$('body').html((b-a) + " ms");
JSfiddle для эталонного примера: http://jsfiddle.net/3t0db1cq/11/
(примечание: в этом тестовом примере я произвел поиск 'foo' 200 раз, поэтому вы можете спросить, почему я не просто кеширую его. На самом деле я буду искать разные термины, поэтому кэширование едва повысит производительность. Также я намеренно поместил искомый термин в наихудшую позицию массива для этого теста)
Можете ли вы помочь мне найти лучший алгоритм для find()
? Чтобы быть справедливым для теста производительности, переместите искомый термин в наихудшую позицию в массиве для вашего алгоритма, если вы хотите сравнить результаты.
(для этого предназначены веб-сайты, поэтому все обычные браузеры должны его поддерживать)