【发布时间】:2014-03-28 11:02:05
【问题描述】:
我想实现一个非常简单的滑动窗口。换句话说,我将有某种列表,其中包含从该列表的右端插入并从左端删除的对象。在每次插入中,先前的对象都会左移一个索引。当列表被对象填满时,在从右端每次插入时,都会从左端删除一个对象(之前的对象当然会像往常一样左移一个索引)。
我想到的是 LinkedList 或 ArrayDeque - 可能后者是更好的选择,因为据我所知,在任一端插入和删除都是 ArrayDeque 的持续努力 O(1),即LinkedList 不是这种情况。对吗?
此外,我想问以下问题:当我插入新对象时,左移存储在滑动窗口中的所有先前对象对于像我的情况一样具有 100,000 甚至 1,000,000 个对象的大型滑动窗口来说是处理密集型的.是否有任何其他数据结构可能在我的应用程序中表现更好?
注意:我使用术语“滑动窗口”来表示我想要实现的功能,也许还有其他术语可以更好地描述它,但我认为从上面的描述中我想清楚我想要做什么。
【问题讨论】:
-
您是否还需要从给定任意索引的容器中快速检索对象的能力? BTW:
LinkedList在 Java 中是一个双链表,这意味着在任一端插入/删除也是 O(1)。 -
@JasonC 不,为此我只需要在一端插入,将先前的对象移动一个索引,然后从另一端删除。我需要快速检索另一个结构,但我解决了这个问题(我想,我现在正在测试它)使用您在上一篇文章中向我建议的“计数器”解决方案的变体。
-
@JasonC 关于 LinkedList,我几天前运行了一个代码,其中一个大小从 100,000 到 1,000,000 不等的 LinkedList 用作滑动窗口。在我看来,这需要很长时间,我认为这可能是由于对象每次移动一个索引。看来我错了!
-
还有来自Apache Commons Collections的
CircularFifoQueue;该实现类似于ArrayQueue,但它会在添加新元素时自动删除旧元素。
标签: java linked-list garbage-collection sliding-window arraydeque