【问题标题】:Ordered Data Structure that allows to efficiently remove duplicate items允许有效删除重复项的有序数据结构
【发布时间】:2010-05-31 17:18:04
【问题描述】:

我需要一个数据结构

  • 必须有序(将元素 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) 操作),但也许我错过了什么?树/堆呢?哈希表/地图?

我必须假设我会用这个数据结构做尽可能多的添加和删除。

谢谢

【问题讨论】:

  • 您并没有真正提到您对“读取”访问的期望。例如,您是否按位置访问元素?这需要多快? 在删除特定元素之后 的位置会发生什么情况?其他元素的位置会相应变化吗?
  • 看来戴夫的解决方案就是您正在寻找的。​​span>

标签: c# java data-structures


【解决方案1】:

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

类似于双向链表,其中有一个额外的 nextEqualItemPtr 和一个指向每个项目的第一个的 HashMap。

然后您可以快速找到要删除的第一个“b”并按照所有 nextEqualItemPtrs 将它们全部删除(双链接因此很容易保持列表完整)。 开销确实使地图保持最新。新项目的 nextEqualItemPtr 列表可以只指向 map.put(key).nextEqualItemPtr 返回的节点

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

【讨论】:

  • HashMap 除了 firstEqualItemPtr 外,还需要一个 lastEqualItemPtr。插入一个新元素变成 O(1)。
  • +1。对问题的编辑使这个解决方案变得完美,IMO。
【解决方案2】:

Apache Collections (homepage) 的Bag 接口应该满足您的要求。它有很多实现,所以也许还有一个可以跟踪插入顺序(你的第一点)。

它有:

  • removeAll
  • remove(count)

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

它被描述为

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多