有序数据结构,允许有效删除重复项

时间:2010-05-31 17:18:04

标签: c# java data-structures

我需要一个

的数据结构
  • 必须订购(将元素a, b and c添加到空结构中,使它们位于0, 1 and 2)位置。
  • 允许添加重复的项目。这是,我可以列出a, b, c, a, b
  • 允许删除给定项目的所有发生(如果我执行delete(1)之类的操作,它将删除结构中1的所有发生次数)。如果我有元素a, b, c, d, c, e并删除元素c,我应该a, b, d, e
  • 我只需要以两种方式访问​​元素。第一个是删除给定的ocorrence(见上文),另一个是我将此结构中的数据转换为列表。

我无法真正选择这里最好的数据结构。我一开始就想过像List这样的东西(问题是在移除项目时有O(n)操作),但也许我错过了什么?树/堆怎么样?哈希表/映射?

我将不得不假设我将添加与删除此数据结构一样多的内容。

由于

2 个答案:

答案 0 :(得分:2)

我认为您可能需要编写专用数据结构(取决于您的效率要求)。

类似于双向链表,其中包含额外的nextEqualItemPtr,以及指向每个项的第一个的HashMap。

然后你可以快速找到要删除的第一个“b”并跟随所有nextEqualItemPtrs将它们全部删除(双链接以便保持列表完整)。 开销确实使地图保持最新状态。新项的nextEqualItemPtr列表只能指向map.put(key)返回的节点.nextEqualItemPtr

我肯定会首先使用一些简单的东西,只有当它太慢时才会插入这种东西。

答案 1 :(得分:1)

Apache Collections homepage)的Bag界面应符合您的要求。它有许多实现,所以也许跟踪插入顺序(你的第一点)。

它有:

  • removeAll
  • remove(count)

与使用普通LinkedListArrayList相比,它也相当快,但我不确定是否插入了元素索引。

被描述为

  

包含每个对象的多个副本的集合的包接口