2012-07-02 93 views
1

是否有另一种更快的方法返回另一个数组中某个数组的部分位置/索引(其中多个值匹配)?这在我的寻路算法中被称为很多,因此可以尽可能快地完成。数组中“匹配”数组的Javascript返回位置索引

我目前的功能是:

// Haystack can be e.g. [[0,1,278.9],[4,4,22.1212]] 

function coordinate_location_in_array(needle,haystack){ 
    for(n in haystack){ 
     if(haystack[n][0]==needle[0] && haystack[n][1]==needle[1]) return n; 
    } 
    return false; 
} 

// Needle of [0,1]: returns 0 
// Needle of [4,4]: returns 1 
// Needle of [6,7]: returns false 

编辑:

我一直乱搞了一下,拿出一个(相当可怕)基于字符串的操纵方法(从而避免了昂贵的for循环)。我认为它仍然稍慢。任何人都可以测试这些方法吗?

function coordinate_location_in_array(needle,haystack) { 
    var str1 = ':' + haystack.join(':'); 
    var str2 = str1.replace(':'+needle[0]+','+needle[1],'*').split('*')[0]; 
    if(str2.length == str1.length) return false; 
    var preceedingElements = str2.match(/:/g); 
    return preceedingElements!=null?preceedingElements.length:0; 
} 

也许有一些改进,第二种方法可能提供一些性能提升?

编辑2:

工作台标记使用jsperf.com所有3种描述的方法(方法最初是最快): http://jsperf.com/finding-matched-array-within-array/3

编辑3:

只需更换for(..in..)循环用for(..;..;..)环(因为我知道haystack阵列将永远不会有“空白”),并且性能似乎有了明显改善:

function coordinate_location_in_array(needle,haystack){ 
    for(var n=0;n<haystack.length;n++){ 
     if(haystack[n][0]==needle[0] && haystack[n][1]==needle[1]) return n; 
    } 
    return false; 
} 

我已更新jsperf页面以包含此最新方法。

+0

可能要发布到http://codereview.stackexchange.com/。 – j08691

+0

谢谢,刚刚发布了整个寻路代码:http://codereview.stackexchange.com/questions/13258/javascript-a-pathfinding-function-for-tile-based-game-optimisation – Alex

回答

2

如果“haystack”没有排序,那么没有办法让它更快。不知道集合中的元素是如何排序的,因为你只需要检查每一件事情就可以发现它们之间的线性关系。

如果您在反复使用同一个“干草堆”上使用此功能,您可以对集合进行排序,并使用排序使其更快地找到“针”(查找不同的排序和搜索算法以查找一个适合您的需要最好的,如使用二进制搜索找到了“针”干草堆被排序之后)

0

我不知道,如果它的速度更快,但你可以这样做:

[1,2,3,4].slice(0,2).toString() == [1,2].toString() 

在你的情况下它将是:

function coordinate_location_in_array(needle,haystack){ 
for(n in haystack){ 
    if(haystack[n].slice(0,2).toString() == needle.toString()) return n 
} 
return false; 

}

也发现了这个帖子,涵盖JS数组的比较:compare-two-arrays-javascript-associative

干杯 悠闲

+0

谢谢,可惜这显著慢。 :( – Alex

+0

我没有对此做任何测量,但由于额外的操作,这是有意义的。 – laidback

0

使用for(..;..;..)循环而不是for(..in..)循环进行的最大区别。

(请参见编辑3在问题结束)

0

在我看来,这仅仅是一个字符串搜索,但用数字代替字符为字符串的组件。因此,Boyer-Moore可能是适用的,特别是如果你的针和干草堆变大。

相关问题