分类数据结构允许按键访问

时间:2014-04-17 13:12:48

标签: algorithm data-structures

是否存在具有以下属性的数据结构?

  1. 每个元素都有自然顺序和键(任意字符串或int)。

  2. 根据元素的自然顺序维护元素的排序。例如,在按以下顺序插入整数后:0,2,3,1,我必须能够按以下顺序遍历它:0,1,2,3(自然顺序)。

  3. 根据其键可快速检索元素,该键可以是任意的。

  4. 插入和检索应具有次线性时间复杂度。

    你可以说它是树和散列图的组合,或者是同时以两种方式排序的树。

    您指向我的代码或库的编程语言并不重要,我可以进行必要的翻译。

3 个答案:

答案 0 :(得分:2)

红黑树有O(log n)搜索,插入和删除。它们是一种平衡的二叉搜索树。它们还支持有序遍历。快速谷歌会提供更多信息。

答案 1 :(得分:2)

有几种可能性。最简单的例子是自平衡二叉搜索树。另请参阅AVL树,B树,B +树,红黑树,跳过列表以及许多其他内容。所有这些(及其变体)都满足您的复杂性要求,尽管有些要求比其他要求更高。

有关详情,请参阅List of data structures

许多可用于多种语言的数据结构都有参考实现。

那就是说,你应该检查一下你的运行时库,看看它是否已经有了一个可以满足你要求的实现。这将为您节省大量时间,而且可能会表现得非常好。

如果您实现自己的数据结构,则可以轻松地使节点包含两个排序的指针。例如,二叉树节点将包含子节点的leftright指针,以及双链表的nextprev指针。树指针将用于比较排序,链表将是插入顺序。数据结构当然包含root节点指针以及链表的headtail

答案 2 :(得分:0)

如果词典排序是可以接受的,那么你可以使用prefix tree来避免基于比较的排序,从而在元素数量中查找O(1)*并提供O(N)*排序元素的数量。

修改前缀树以存储值并不困难。虽然,为此目的使用单独的地图可能更容易。

*请注意,前缀树的复杂性通常基于元素本身的平均大小来测量,即O(m)。但是,大多数其他数据结构使用数据结构中的元素数量,因此当考虑每个元素的大小时,复杂性会稍微改变。通过这种方法,哈希表查找为O(m),二进制搜索树查找为O(m log N)。