【问题标题】:Sorted data structure allowing access by key排序的数据结构,允许按键访问
【发布时间】:2014-04-17 13:12:47
【问题描述】:

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

  1. 每个元素都有一个自然顺序以及一个键(任意字符串或整数)。

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

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

插入和检索应该具有亚线性时间复杂度。

您可以说它是树和哈希图的组合,或者是同时以两种方式排序的树。

你指给我的代码或库的编程语言是什么并不重要,我可以做必要的翻译。

【问题讨论】:

  • 澄清一下:您希望能够按0, 2, 3, 1的顺序遍历,也可以按0, 1, 2, 3的顺序遍历?

标签: algorithm data-structures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有几种可能性。最简单的例子是自平衡二叉搜索树。还可以查看 AVL 树、B-树、B+ 树、红黑树、跳过列表等。所有这些(及其变体)都满足您的复杂性要求,尽管有些比其他更有效。

    请参阅List of data structures 了解更多信息。

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

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

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

    【讨论】:

    • 使用所有这些数据结构,您要做的就是保留实际项目的线性列表,以便按插入顺序进行迭代。树或任何维护对线性列表中项目的引用。列表的添加是 O(1) - 只是追加。
    • @LucasTan:请参阅我关于在节点中维护链表的更新。
    【解决方案3】:

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

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

    *注意,前缀树的复杂度一般是根据元素本身的平均大小来衡量的,即O(m)。然而,大多数其他数据结构使用数据结构中元素的数量,因此当考虑每个元素的大小时,复杂性会有所变化。通过这个衡量,哈希表查找是 O(m),二叉搜索树查找是 O(m log N)。

    【讨论】:

    • “O(1) in the number of elements”应该是什么意思?在前缀树中查找通常是键长度的函数。
    • @JimMischel:时间复杂度的计算方式有所不同。大多数时候,密钥的长度被认为是一个常数,因此被忽略了,所以我试图保持一致。但是,我现在已经对差异进行了说明。
    猜你喜欢
    • 2013-06-19
    • 2012-02-23
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2015-08-13
    • 2015-10-19
    相关资源
    最近更新 更多