【问题标题】:Flattened Tree as an Unrolled Linked List for fast Binary Search扁平树作为展开链表用于快速二分搜索
【发布时间】:2018-03-08 14:30:24
【问题描述】:

我有一个树形数据结构,我将其转换为一个已排序的平面列表(展开的链表数据结构)。现在我想做一个快速的二进制搜索,我想出的想法是:每个列表元素都存储一个指向另一个元素的指针,该元素是原始树结构中的 MID 子元素。为了快速删除,最好让每个元素也指向其“父级”。

问题:

  • 这已经是一个命名数据结构了吗?它的“官方”名称是什么?
  • 排序插入、删除和随机访问(也称为搜索)的时间复杂度 O(?) 是多少?

[编辑] 这是这种结构的半图形表示:

这棵树(用 JSON 表示法编写):

    {
      "abc": {
        "a": 42,
        "b": 43,
        "c": 44
      },
      "d": 45,
      "e": {
        "f": {
          "g": 46,
          "h": 47
        }
      }
    }

被展平到这个列表: (“-> x”表示元素指向索引x处元素的地址) (每个元素存储来自原始树的键和值,如果有的话)

    [0] "abc": nil -> 2
    [1] "a":   42  -> nil
    [2] "b":   43  -> nil
    [3] "c":   44  -> nil
    [4] "d":   45  -> nil
    [5] "e":   nil -> 6
    [6] "f":   nil -> 7
    [7] "g":   46  -> nil
    [8] "h":   47  -> nil

传说:

    [INDEX] "KEY": VALUE -> ADDRESS OF MID CHILD ELEMENT

【问题讨论】:

    标签: linked-list tree binary-search


    【解决方案1】:

    如果我理解正确,您正在考虑 linked list(或者如果您还链接到前一个元素,则为双向链表)。

    关于插入,链表的搜索时间为 O(n),插入时间为 O(1),树的搜索时间和访问时间范围为 O(n) 到 O(log n),具体取决于它们是如何排序的,我让你see for yourself

    最后,如果你使用的是 O(log n) 搜索时间的树,你最好直接使用它,否则取决于将你的树变成排序链表需要多长时间(可能是 O(n))。

    另外,作为奖励,读取树的“中间”子节点的科学术语称为“有序遍历”,而不是前序和后序遍历。

    【讨论】:

    • 我了解到链表中的每个元素都包含一个指向下一个元素的指针。我所拥有的是一个链表(而不是展开的链表,但在这里似乎不相关),其中一个元素指向其子元素的中间(假设该元素以前是具有 n 个子节点的树结构的一部分)。这种结构不同于普通的链表。这个有名字吗?
    • 至于为什么我首先要展平原始树结构:实际上我什至没有树,而是将数据保留在展开的链表中。我在我的问题中引入了树来说明数据的实际语义结构。
    • @kitomer 我不确定我真的明白你在说什么结构(尤其是你如何定义“它的子元素中间”)。你可以发布一个例子吗?图表、类/结构定义、“添加”方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多