【问题标题】:Tree with duplicate entries at leaves叶子上有重复条目的树
【发布时间】:2013-06-07 22:49:09
【问题描述】:

我将数据存储在树的叶子中。使用作为对象元组的键访问叶子。这棵树可能很大,我想浓缩它。例如:

        *
       / \
      a   b
     /|\   \
    1 2 5   1
   / /| |\  |\
  x x y x z y z   <-- Leaves
  | | | | | | |
  1 2 7 1 3 1 1   <-- Values at leaves

元组(*, a, 1, x)(*, a, 5, x) 都在叶子上导致1 的值,因此可以将树压缩为:

        *
       / \
      a   b
     / \   \
    A   2   1
   /|  /|   |\
  x z x y   y z
  | | | |   | |
  1 3 2 7   1 1

其中A 代表15。当然,由于必须检查集合A 中的成员身份,查找速度会减慢。我正在寻找描述此数据结构和相关过程的来源。

我正在使用 c++,以防有人受到启发分享相关代码问题。

【问题讨论】:

  • 听起来很像构建 Patricia trie 之类的东西。
  • 我可能会使用类似的东西作为冷凝的一部分,但我还需要更多的东西。
  • 这是一个怎样的搜索树?
  • 我删除了搜索形容词。谢谢。 (我应该怎么称呼它?)
  • 这是我对您要求的理解。假设有从1hh 级别。如果在每个级别(任何 1 级别除外)路径中的元素相同,则将两个根路径合并到叶路径

标签: c++ algorithm data-structures tree


【解决方案1】:

在不知道您使用树的目的的情况下,很难提出建议,但我相信这样的树结构在实践中永远不会真正有用,因为使用某种排序集或关联要容易得多地图比这个。

但是,如果您已经有了树结构并希望保持与当前完全相同的效率,则可以不合并分支,而是用指向数据的指针替换所有叶子。这样,您可以将每个数据对象存储一次,并让多个叶子指向同一个数据对象。它也是最灵活的解决方案,因为您仍然可以通过简单地更改指针来更改任何叶子的值,而在您合并分支的想法中,如果没有持久的数据结构就无法撤消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多