【问题标题】:how to optimize search difference between array / list of object如何优化数组/对象列表之间的搜索差异
【发布时间】:2012-03-17 10:44:22
【问题描述】:

前提: 我将 ActionScript 与两个数组集合一起使用,其中包含具有要匹配的值的对象...
我需要一个解决方案(如果在框架中有一个做得更好的库),否则任何建议都会受到赞赏......

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

  • 在 A 中所有在 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 消耗更少)的方法来做到这一点......

【问题讨论】:

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


    【解决方案1】:

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

    顺便说一句,Vectors 比 ArrayCollections 更快的原因是您为 VM 提供了类型提示。 VM 确切地知道每个对象在集合中的大小,并据此执行优化。

    向量的另一个优化是在进行比较之前先按名称对数据进行排序。如果由于排序原因,在列表 A 的更下方找不到列表 b 的名称,则添加另一个检查以跳出循环。

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

    【讨论】:

    • 谢谢您的回复...我会调查一下...将object.nome分配为objA和objB的键的想法还不错,这样我可以轻松检查如果使用 objA.hasPropery(value)...
    • 是的,查找是在恒定的时间内,这使得它超级快!
    • 谢谢,我没有多少时间...我使用 2 个向量部分解决了我的问题。 并从一个向量循环所有元素.. 如果在第二个元素中找到第一个元素,它将是从两个向量中删除,所以最后我有第一个向量,其中所有元素都不存在于第二个向量中,反之亦然......
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2015-07-30
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多