【问题标题】:find index of element inside a collection, which collection to use?查找集合内元素的索引,使用哪个集合?
【发布时间】:2011-10-03 19:44:53
【问题描述】:

我在选择正确的数据结构时遇到问题,这些是要求:

  • 我必须能够插入和删除元素
  • 我还必须能够获取集合中元素的索引(集合中的顺序)
  • 元素具有唯一的标识符号
  • 我可以使用任何标准对元素进行排序(如有必要)

排序并不是必须的,重要的是获取元素的索引,不管内部如何实现,但无论如何我认为最好的方法是排序。 元素的索引是集合内的顺序。所以必须使用某种顺序。当我删除一个元素时,从该元素到最后的其他元素会更改它们的顺序/索引。

第一种方法是使用链表,但我不想要 O(n)。 我还考虑过使用和排序字典,这将为查找/插入/删除提供 O(log n),不是吗? 有更好的方法吗?我知道 TRIE 会为常见操作提供 O(1),但我不知道如何获取元素的索引,我必须遍历 trie 并给出 O(n),我错了吗?

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    听起来您想要一个有序的数据结构,即(平衡的)BST。插入和删除确实是 O(lg n),这对于许多应用程序来说已经足够了。如果您还希望元素在结构中具有索引,那么您需要一个order statistic tree(例如,参见 CLR,算法简介,第 14 章)在 O(lg n) 中提供此操作。动态重新排序整个集合将是 O(n lg n)。

    如果“集合中的顺序”是指任何随机顺序都足够好,那么只需使用动态数组(向量):摊销 O(1) 追加和删除,O(n lg n) 就地排序,但 O(n) 查找直到您进行排序,之后查找变为 O(lg n)二进制搜索。但是,如果数据要保持排序,则删除将是 O(n)。

    如果您的数据是类似字符串的,您可以扩展一个 trie,就像扩展 BST 以成为订单统计树一样。

    【讨论】:

    • 谢谢,我刚刚搜索了订单统计树。正如您所说,他们有一个返回元素“等级”的方法,这正是我所需要的。此外,将 trie 扩展为类似于订单统计树的行为非常有趣。
    【解决方案2】:

    您在这里没有提到数组/向量,但它符合大多数这些标准。

    (请注意,“元素具有唯一的标识符号”实际上与数据结构无关;这与索引的含义相同吗?或者它是一个不可变的键,它更像是您要放入的数据的函数结构...)

    在任何情况下都会有时间权衡:你说链表是 O(n),但 O(n) 是为了什么?您并没有真正了解添加、删除和搜索的性能要求;哪个更重要?

    【讨论】:

    • 是的,你是对的,我只是想表明如果你想使用它,你已经有一个可用的标识符。我的意思是 O(n) 用于在链表中插入/删除/查找。矢量是好的,但不是最好的删除(虽然我可以做一些有间隙的二分搜索)
    【解决方案3】:

    如果您的集合已排序,您不需要 O(n) 来查找元素。例如,可以使用二进制搜索来确定元素的索引。也可以在数组中编写关于 Entry 的简单包装器,它会记住它在集合中的索引。

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多