比较两个数组的有效方法

Posted

技术标签:

【中文标题】比较两个数组的有效方法【英文标题】:Efficient way to compare two arrays 【发布时间】:2014-05-15 23:24:26 【问题描述】:

我正在使用两个数组来完成检查array1 中的值是否存在于array2 中的任务。如果是这样,请删除 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 秒调用一次执行此操作的函数,这对我来说看起来非常低效。

有人可以建议一种比上述更好的算法或数据结构,我可以使用吗?如果可以,我将如何使用。

【问题讨论】:

数组中元素的类型是什么?数组是否按任何特定顺序排列? 建议的字典方法是一种很好的方法。另一种方法是对两个列表进行排序,然后按顺序遍历它们,就像您进行标准合并一样。也就是说,如果您的列表不是很大,那么您的“低效”方法将足够快。 我的列表包含整数值,它们最多包含 50 个值,但问题是我必须每 5 秒运行一次此操作。因此搜索实际上每 5 秒完成一次,直到第一个列表为空。不过我会查字典 对于最大大小为 50 的数组,您说的是最多 2,500 次迭代。将花费的时间将以毫秒为单位。每五秒执行一次完全没有问题。 谢谢.. 有道理! 【参考方案1】:

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

【讨论】:

else: return "Not equal"。最后:if dict not empty: return "Not equal" 谢谢,我会尝试使用这个想法!【参考方案2】:

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

在我的情况下,它是 Google 脚本的一部分,并且超过了典型数据集的最大执行时间(约 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

【讨论】:

以上是关于比较两个数组的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在 D 语言中比较两个内存块的最有效方法是啥?

比较非常大的值php的有效方法

比较两个以上的numpy数组

比较两个数组并查找第二个数组中缺少的项目[重复]

字符串165. 比较版本号

如何有效地逐项比较两个大 XML 文件?