在一段时间之前驱逐事件的有效数据结构?

时间:2012-02-04 20:57:56

标签: java sorting data-structures

我有一个由ID和日期组成的对象集合。我想以一种方式存储这些对象,我可以通过ID高效地查找它们,还可以删除在某个时间点之前发生的所有事件。

我在考虑使用HashMap和TreeMap,其中HashMap保存ID,TreeMap存储按日期排序的元素。这通过ID提供O(1)查找,并让我有效地删除所有旧事件。我还尝试使用日期的排序树图,而不使用ID的哈希表。

是否有更高效的数据结构用于存储信息以有效支持这些操作?

1 个答案:

答案 0 :(得分:1)

鉴于您要支持的操作是

  • 插入,
  • 按ID查找,
  • 删除之前发生的所有事情,

我认为你可能想要使用一个链式哈希表和一个splay树的组合的数据结构。基本思想如下:哈希表将ID值映射到相关对象,splay树存储按日期排序的对象。要插入到结构中,请在O(log n)分摊的时间内将元素插入到ID哈希表和splay树中。您可以在哈希表中的O(1)预期时间内进行查找。

根据问题的参数,您可以非常有效地删除在一段时间之前出现的所有元素。这个想法如下。有效的splay树(摊销的O(log n))支持删除树中时间在某个特定值之前的所有内容。现在,如果您插入到此结构中的条目具有以下属性:每当您在某个时间之后删除所有值时,您都不会在此之前插入条目,您可以使用以下删除过程:首先,使用高效算法删除所有需要在总摊还时间O(log n)中删除的splay树中的条目,然后记录刚刚删除的时间。从那时起,只要你在哈希表中进行查找,如果你看到一个时间低于给定时间阈值的元素,你就删除它。如果在重新散列期间执行此操作,则可以将所需的O(n)工作分散到应该删除的哈希表中的所有内容,只需要在需要时立即删除,因此可以分摊工作。这仍然为您提供O(1)查找时间ID和O(1)分摊插入时间到哈希表。简而言之,如果您可以做出这个假设,那么您将获得以下运行时:

  • 插入:O(log n)摊销。
  • 按ID查询:O(1)预期。
  • 在时间T:O(log n)摊销前全部删除。

希望这有帮助!