我需要结构(Arraylist,LinkedList等),这种情况非常快: 虽然结构不是空的,但我在结构中搜索满足条件的元素,比方说k,删除满足k的元素并重新开始另一个条件让我们说k + 1。
e.g:
for (int i = 1 ; i <= 1000000; i++) {
structure.add(i);
}
d = 2;
while (!structure.isEmpty()) {
for(int boom : structure.clone) {
if (boom % d == 2) {
structure.remove(boom);
}
d++;
}
}
答案 0 :(得分:2)
如果元素是基元,则最快的结构很可能是专门的基元集合(例如,trove)。以下对盒装基元的引用是一个几乎可靠的缓存未命中,这可能会占据成本。
出于同样的原因,我不会建议LinkedList
:由于缓存未命中,它已经死了。
如果订单不重要,那么ArrayList
是完美的。而不是删除元素,将其替换为最后一个元素,并删除最后一个数组元素。这是一个O(1)
操作,不会受到糟糕的空间局部性影响。
如果订单很重要,您可以构建自己的ArrayList
类结构。不要删除元素,而是将其标记为删除元素,例如在BitSet
或boolean[]
中。最后,通过将所有元素移动到正确位置并调整长度,在一次扫描中执行移除。优化后的循环很可能与CharMatcher.removeFrom loop类似。
更简单的解决方案是使用ArrayList
并将所有幸存的元素复制到另一个元素。我敢打赌它会击败LinkedList
手。作为一个次要的GC-friedly优化,您可以使用两个列表。
答案 1 :(得分:0)
LinkedList应该是最快的。显式使用迭代器(structure.iterator())并调用迭代器的remove方法而不是调用structure.remove(element)!
答案 2 :(得分:0)
我不知道您的确切用例,但这是一个注释。
如果你的谓词P1 .. PN预编译,可用,如果你没有修改集合的内容,如果你的谓词不相互依赖,你可能想要创建一个复合谓词,比如以某种逻辑顺序捆绑N个谓词,然后只在集合上的一次迭代中执行过滤方法。
至于数据结构,我想如果它是这样的:
如果我的过滤谓词完全是任意的,那么列表应该可以使用。
在一些非常有限和严格的值集的特定情况下,您可能会考虑树状结构或类似图形的结构,其中您可能有一些主节点,表示属性“property1”具有值“value1” 。如果你想删除“property1”值为“value1”的所有项目,你可以告诉主节点删除他的所有子节点(并且他们应该将自己从他们可能拥有的任何其他父节点中分离出来)。
答案 3 :(得分:0)
如果您自己构建列表,可以考虑使用sorted
数据结构。它将为您提供最佳搜索性能(log n
复杂性,因此速度非常快。)
LinkedList为您提供恒定的时间元素删除,但随机访问不具有恒定的复杂性(缓慢)。
如果LinkedList或排序列表对您的方案更快,则必须进行基准测试。
答案 4 :(得分:0)
如果您的元素是int
s,我认为位设置将是此任务的最快数据结构。迭代将比通过数组列表稍慢(即使不是标准java.util.ArrayList
,只有原始特化),但删除操作几乎没有任何成本,而从任何数组列表中删除都非常昂贵。
注意,通过直接使用long[]
作为位设置并手动执行按位操作,您可以获得更多收益,因为java.util.BitSet
不是非常注重性能的。但是,有道理,从BitSet
开始。