如何优化数组/对象列表之间的搜索差异

时间:2012-03-17 10:44:22

标签: optimization actionscript coding-style arraylist symmetric-difference

Premesis: 我正在使用带有两个arraycollections的ActionScript,其中包含要匹配值的对象...
我需要一个解决方案(如果在框架中有一个更好的库),否则任何建议都会受到赞赏......

假设我有两个元素A和B列表(没有重复值),我需要比较它们并删除两者中存在的所有元素,所以最后我应该

  • 在A中的所有元素但不在B
  • 在B中B中的所有元素但不在A

现在我做了类似的事情:

            for (var i:int = 0 ; i < a.length ;)
            {
                var isFound:Boolean = false;
                for (var j:int = 0 ; j < b.length ;)
                {
                    if (a.getItemAt(i).nome == b.getItemAt(j).nome)
                    {
                        isFound = true;
                        a.removeItemAt(i);
                        b.removeItemAt(j);
                        break;
                    }
                    j++;
                }
                if (!isFound)
                    i++;
            }

我循环两个数组,如果找到匹配项,我会从两个数组中删除项目(并且不要增加循环值,以便for循环以正确的方式进行)

我想知道是否(并且我确定有)更好(并且耗费更少CPU)的方式来做...

1 个答案:

答案 0 :(得分:1)

如果你必须使用一个列表,并且你不需要arraycollection的能力,我建议简单地将它转换为使用AS3 Vectors。与Arrays相比,根据此(http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/)的性能提升为60%。我相信Arrays已经比我曾读过的一篇文章中的ArrayCollections快3倍。不幸的是,这个解决方案仍然是O(n ^ 2)。

另外,Vector比ArrayCollections更快的原因是因为你为VM提供了类型提示。 VM确切地知道每个对象在集合中的大小,并基于此进行优化。

向量的另一个优化是在进行比较之前首先由nome对数据进行排序。如果由于排序而无法在列表A中找到列表b的nome,则添加另一个检查以突破循环。

如果你想比那更快,请使用关联数组(as3中的对象)。当然,这可能需要更多的重构努力。我假设object.nome是对象的唯一字符串/ id。只需将nome的值指定为objectA和objectB中的键即可。通过这种方式,您可能不需要遍历每个列表中的每个元素来进行比较。