分而治之三叉树搜索

Posted

技术标签:

【中文标题】分而治之三叉树搜索【英文标题】:Divide and Conquer Ternary Tree Search 【发布时间】:2021-05-12 09:36:24 【问题描述】:

我正在尝试解决一个练习,其中给你一个完美的三叉树,其中每个节点都包含一个整数。我们要计算有多少内部节点符合这些规范:

    节点数大于其所有子节点数 最大的孩子是中间的孩子

例如在下面的树中只有 3 个节点符合这些规范

设计和分析一种分治算法,该算法计算满足规范的节点数。这个算法应该是O(n)的,其中n是叶子的个数,n是3的幂。不用考虑树的数据结构,只解释一个算法

所以我尝试设计这个算法: 我是算法设计的新手,我不知道我所做的时间复杂度是多少,或者即使它是一种分而治之的算法。如果您知道如何帮助我计算时间复杂度或检查它是否真的是一个分而治之的解决方案,请告诉我。另外,如果您有比我更好的想法,请提供帮助。谢谢

【问题讨论】:

【参考方案1】:

首先,几乎每个递归都可以被视为分而治之,因为您将问题拆分为子问题。

其次,请注意您最多访问树的每个节点一次,因此运行时间确实是您希望的 O(n)

我刚刚注意到您将n 定义为叶子数,而不是节点数,但分析仍然有效,因为对于高度为h 的树,节点数为1+3+..+3^h-1 = O(3^h),并且在h 级别有 3^h 正好叶子。所以算法确实在 ~O(3n)=O(n) 时间内运行

最后一点,我觉得你做的其实很好!但在实践中,我认为在这种情况下编写递归主要是通过“分支”而不是通过级别,这意味着你先深入再深入。 为了更清楚地说明这一点,我的意思是,最终代码将如下所示:

def countSpeacialNodes (Node t):
if t doesnt have children: return 0
if t is bigger than its children AND t's biggest child is the middle:
return 1+CSN(t.left)+CSN(t.middle)+CSN(t.right)
else return CSN(t.left)+CSN(t.middle)+CSN(t.right)

所以总结一下,你可以注意到这里是先到树的深处,再到树的“宽”,而且不需要标记节点

希望对你有所帮助

【讨论】:

当然,没问题。 “任何给定的树”是指任何三元树?或完整(每个节点有 3 个子节点或 0 个子节点)?询问因为第一种情况需要对代码进行一些修改。无论如何,这里的归纳将是关于树的高度:首先表明对于高度为 0 的给定树它正在工作(肯定会!它将在第一行之后退出代码并返回 0!)然后假设对于高度“h-1”,代码正在运行。最后一部分是为一棵高度为 h 的树展示它,这很容易,因为“返回”行已经与您的案例分开了。告诉我需要更多帮助

以上是关于分而治之三叉树搜索的主要内容,如果未能解决你的问题,请参考以下文章

为啥二分搜索是一种分而治之的算法?

机器学习入门之决策树1

分而治之算法 - 二分搜索变体

分而治之的算法(二分搜索的应用?!)

递归线性搜索的复杂性是多少(使用分而治之的技术)?

软硬件调试九法:第四条规则 分而治之