比较两个数组的有效方法

时间:2014-04-03 21:29:04

标签: javascript algorithm data-structures

我正在使用两个数组来完成检查array1中是否存在array1中的值的任务。如果是这样,删除array1中的内容并继续检查,直到array1为空。如果它们不存在则只从函数返回。我正在使用Javascript

我使用经典的两个for循环实现了它,它的运行时间为o(n * 2)。我想知道是否有任何其他有效的方法来使用javascript支持的任何其他数据结构来执行此操作。以下是我目前的实施

for(var j = 0; j < tempArray.length; j++){
     for(var k = 0; k < this.probsSolved.length; k++){
         if(tempArray[j] == this.probsSolved[k]){
             tempArray.splice(j,1);            
             if(tempArray.length <= 0){
                 this.updateAchievements(achID);
                 this.storage.set(achKey,1);
                 return;
             }         
     }
}

问题是我必须每隔5秒调用一次执行此操作的函数,这对我来说效率非常低。

有人可以提出一个更好的算法或数据结构,其性能优于我可以使用的算法或数据结构,如果是这样,我将如何使用。

2 个答案:

答案 0 :(得分:5)

array2的元素放在字典数据结构中(以确保快速查找)可能会有所帮助。

请参阅How to do associative array/hashing in JavaScript

在伪代码中,我的方法如下:

dict = {}

foreach elem in array2:
    insert elem in dict

foreeach elem in array1:
    if elem in dict:
        remove elem from array1

答案 1 :(得分:5)

添加替代答案,因为这仍然与我们许多人有关。我在寻找一种优化脚本的方法时发现了这个问题,该脚本比较了两个都有成千上万个键的数组。

在我的情况下,它构成了Google Script的一部分,并且超过了典型数据集的最长执行时间(约5分钟)。进行以下更改可将执行时间缩短至10秒以下。

低效率比较(最大i * j次迭代):

var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];

for (var i in list1) {
    for (var j in list2) {
        if (list1[i] == list2[j]) {
            alert('found ' + list1[i] + ' in both lists');
        }
    }
}

有效比较(最大i + j次迭代)

var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];
var lookup = {};

for (var j in list2) {
    lookup[list2[j]] = list2[j];
}

for (var i in list1) {
    if (typeof lookup[list1[i]] != 'undefined') {
        alert('found ' + list1[i] + ' in both lists');
        break;
    } 
}

在此处找到:https://bytes.com/topic/javascript/insights/699379-optimize-loops-compare-two-arrays