【问题标题】:Count the number of entries in BST with key k in time O(h)在时间 O(h) 内用密钥 k 计算 BST 中的条目数
【发布时间】:2013-10-13 23:31:06
【问题描述】:

上周我参加了考试,遇到了以下问题:

描述如何修改二叉搜索树以计算 在 O(h) 时间内使用键 k 的 T 中的条目数。这个算法应该返回一个 整数,而不是列表。

然后在考试后公布答案,如下:

解决方案:通过向每个节点添加内部节点的数量来修改树 以该节点为根的子树。在插入、删除节点时重新计算这些, 并可能进行重组。这将需要以下算法:

但这似乎很混乱。我的问题是我用红色圈出的那些部分的作用是什么?

【问题讨论】:

  • 在考试的任何地方都指定了树中节点的结构吗? count 似乎是与每个节点关联的变量,但在该算法的任何地方都没有定义它。
  • 抱歉 O(h) 是对的,我的意思是大 O
  • 不是这个,我考试的时候看不懂
  • 标题说o(h),问题说O(h)。虽然它们与您想知道的无关,但我想指出它们是不同的集合。除此之外。由于搜索树的排序,T.left.rightT.right.left 在这两种情况下仅保存您要查找的值。你知道如果T.left.value == k,那么对于存储的值,你有T.left <= T <= T.rightT.left.value <= T.left.right <= T.value,因为T.left.value == T.value,不等式坍缩为T.left.right的等式;另一个类似。

标签: algorithm data-structures tree big-o binary-search-tree


【解决方案1】:

假设您找到一个节点 node,其值为 k,这就是您要搜索的内容。现在,假设node.left.value = k。您对子树node.left.right 中的所有内容了解多少?那里的每个值都必须小于或等于k(因为它在node 的左侧)但也必须大于或等于k(因为它在node.left 的右侧)。因此,该子树中的所有值都等于k。作为一种优化,该算法避免在这种情况下递归下降到该子树,而是自动将该子树中的所有内容添加到总数中。这是获得 O(h) 运行时所必需的;如果您探索了这些树中的所有节点,如果树中的所有 n 值都等于 k,则运行时间可能为 Ω(n)。

node.right.leftnode.right.value = k 的情况下也适用类似的逻辑。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2016-04-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多