【问题标题】:Balancing a ternary search tree平衡三元搜索树
【发布时间】:2018-07-05 00:33:59
【问题描述】:

如何“平衡”三元搜索树?大多数 tst 实现不解决平衡问题,但建议以最佳顺序插入(我无法控制。)

【问题讨论】:

  • 搜索树有多大?
  • 几千个字,从 4 到 20 个字符。不知道是大是小,但对我来说很大。
  • 听起来像是在树到达某个点时扔掉它并用“最佳顺序”构建的树替换它是你最好的选择——如果你能抽出时间的话,应该需要几毫秒。
  • 我想知道重新平衡是否很简单,例如将节点更改为其 lo 子节点及其所有 lo 子节点本身以及 hi 子节点及其所有 hi 子节点的中间元素。跨度>

标签: algorithm ternary-tree ternary-search-tree


【解决方案1】:

Dobbs 博士关于Ternary Search Trees 的文章说:D.D. Sleator 和 R.E. Tarjan 在“自调整二叉搜索树”(ACM 杂志,1985 年 7 月)中描述了三叉搜索树的理论平衡算法。您可以使用自己喜欢的搜索引擎找到本文的在线版本。

【讨论】:

  • 注意(略读论文后):建议的方法(展开)即使在只读操作期间也会重新平衡树,因此可能不适合多线程访问。
【解决方案2】:

一个简单的优化是让它成为一个红黑树,这样可以避免一些最坏的情况。 TST 实际上只是二叉树,其中给定节点的值是另一个 TST。因此,节点的“中间”子节点实际上并不是在每个级别都处于平衡状态的树的一部分,因为它无论如何都不能移动到不同的父节点。

这确保了 trie 的每一层都在 log(R) 时间内遍历,尽管考虑到每个节点的 subtries 的大小,您可能会做得更好。不过这看起来要复杂得多!

【讨论】:

    【解决方案3】:

    二叉搜索树的一般化是B-Tree,它适用于从 2 开始的任何地方的扇出。这不是唯一的方法,但它是一种常见的方法。

    它的大致工作方式是,如果插入或删除会使树失去平衡,它会从相邻节点窃取元素或空间。如果这还不足以保持树的平衡,它的高度将被改变以腾出空间。

    【讨论】:

    • OP 谈到了 三元 搜索树。
    • 我完全不清楚 1-2 B-Tree 与三叉树有何不同。能给我解释一下吗?
    • B 树(通常)包含节点中的完整键。在三元搜索树中,键由节点的路径定义。
    【解决方案4】:

    阅读这篇文章:

    “使用条件旋转和随机启发式的三元搜索尝试的自我调整” 经过 “Ghada Hany Badr∗ 和 B. John Oommen †”

    它将帮助您了解自我调整和平衡 TST。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多