查找集合中元素的索引,使用哪个集合?

时间:2011-10-03 19:44:53

标签: algorithm data-structures

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

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

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

第一种方法是使用链表,但我不想要O(n)。 我也想过使用和排序字典,这会给O(log n)进行查找/插入/删除,不是吗? 有更好的方法吗?我知道TRIE会给O(1)进行常见操作,但我不知道如何获取元素的索引,我将不得不迭代trie并给出O(n),我错了吗? / p>

3 个答案:

答案 0 :(得分:2)

听起来你想要一个有序的数据结构,即(平衡的)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一样成为订单统计树。

答案 1 :(得分:1)

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

(注意“Elements有一个唯一的标识号”实际上与数据结构无关;这是否与索引相同?或者它是一个不可变的键,它更像是你所放入的数据的函数结构......)

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

答案 2 :(得分:0)

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