如何编写程序来生成排序决策树?

Posted

技术标签:

【中文标题】如何编写程序来生成排序决策树?【英文标题】:How can I write a program to generate a sorting decision tree? 【发布时间】:2010-11-29 09:05:05 【问题描述】:

在课堂上,我们得到了一个简单的决策树,用于对 3 个元素(a、b、c)进行排序。

(来源:brpreiss.com)

看着这个,我觉得很有意义。我能够关注它。

但是,我现在必须为 4 个元素(a、b、c、d)制作决策树,并且叶子的数量刚刚达到 24 个。

我正在努力以一种有条不紊的方式接近决策树,这有助于我跟踪我想在每个分支上比较的元素。

什么是构建更大决策树的有条不紊的方法?如果我知道怎么做,我什至愿意编写一个程序来吐出可能的叶子结构。

【问题讨论】:

+1 表示图表。我刚刚在阅读有关决策树的内容,这对我很有帮助。 【参考方案1】:

Charles Forgy 已经描述了这种算法:参见Rete algorithm。 (对不起,WP中的文章肯定不是一个快速的答案,但它可能是一个好的开始)

【讨论】:

【参考方案2】:

您可能想查看 Sorting Networks。我认为应该可以将给定数量的输入的最佳排序网络转换为决策树。

或者,您可以采用给定的排序算法并逐步执行它,在每次比较时创建一个新分支。

最后,您可以反过来执行此操作 - 例如,采用合并排序类型的方法:将所有 24 个可能的排序顺序放在树的底部。选择一个比较,并根据结果将叶子分成两组。对每个分支递归重复,直到每个分支只有一个叶子。

【讨论】:

【参考方案3】:

一个简单的方法,在这种情况下,是扩展现有的树。深度 3 树最多可以对 2^3=8 不同的结果进行排序,这足以对 3 个元素进行排序,因为 3! = 66 <= 8。要对 4 个元素进行排序,您至少需要深度 5:4! <= 2^5。鉴于abc 已经按您现有的网络排序,我们可以构建两个新的最低级别来决定在哪里插入d

假设xyz是排序的,那么x<y<z你可以使用这个网络在它的正确位置添加一个新元素d

// note: read from right to left
d<x<y<z -[yes]- (d<x)? -[yes]-- (d<y) -
x<d<y<z -[no]-/               /
x<y<d<z -[yes]- (d<z)? -[no]-/
x<y<z<d -[no]-/

因此,您基本上可以使用现有树,将其复制 4 次,然后将每个当前叶替换为上述子树,在每种情况下,将 xyz 替换为 @987654339 的顺序@、bc 在当前叶子中。

请注意,虽然这适用于您的特定情况,并且会生成最小树,但附加子树以插入“下一个元素”不会为其他情况生成最小高度排序树。例如,要对 a,b,c,d,e 进行排序,最小高度将为 7,如 5! = 1207^2 = 128。但是,将e 放置到已排序的 4 个元素列表中的子树本身至少需要深度 3(因为有 5 个可能的插入位置) - 所以我们可以轻松构建 5+3 = 8-depth树,但需要另一种方法来构建有效的深度为 7 的树。

对于一般性讨论,Nick's answer 中关于排序网络的链接非常相​​关:您可以通过从左到右读取网络来从网络构建排序树,为每个连接创建一个节点,然后,将网络的两种变体视为子网络:一种已进行交换(例如,a&lt;b 为假,所以现在ab 被交换),另一种不需要它(因为@987654350 @)。排序决策树的深度是它的排序网络的深度,根据那个页面,虽然一种算法可以生成对数深度树/网络(AKS),但绝不简单.

【讨论】:

以上是关于如何编写程序来生成排序决策树?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

数据结构——树——二叉查找树转换成排序的循环双向链表

将二叉搜索树转变成排序的双向链表

MS - 把二元查找树转变成排序的双向链表

从决策树进行预测的高效算法(使用 R)