在课堂上,我们得到了一个简单的决策树,用于对3个元素(a,b,c)进行排序。
(来源:brpreiss.com)
在看这个时,对我来说很有意义。我能够遵循它。
但是,我现在必须为4个元素(a,b,c,d)创建一个决策树,并且叶子的数量刚刚达到24个。
我正在努力以有条不紊的方式接近决策树,这有助于我跟踪我想要在每个分支进行比较的元素。
什么是有条不紊地接近构建更大决策树的方法?如果我知道如何,我甚至愿意写一个程序来吐出可能的叶子结构。
答案 0 :(得分:2)
您可能希望查看S orting Networks。我认为应该可以将给定数量输入的最佳排序网络转换为决策树。
或者,您可以采用给定的排序算法并逐步完成,在每次比较时创建一个新的分支。
最后,您可以反向执行此操作 - 例如,通过采用合并排序类型方法:在树的底部布置所有24种可能的排序顺序。选择一个比较,并根据结果将叶子分成两组。对每个分支递归重复,直到每个分支只有一个叶子。
答案 1 :(得分:0)
Charles Forgy描述了这种算法:见Rete algorithm。 (对不起,WP中的文章肯定不是一个快速的答案,但它可能是一个好的开始)
答案 2 :(得分:0)
在这种情况下 的一种简单方法是扩展现有树。深度为3的树最多可以对2^3=8
个不同的结果进行排序,这足以对3个元素进行排序,因为3! = 6
和6 <= 8
。要对4个元素进行排序,您至少需要深度5:4! <= 2^5
。假设d
,a
和b
已经按照您现有的网络进行了排序,我们可以构造两个最低的新级别来确定在何处插入c
。>
假设x
,y
和z
已排序,因此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次,并用上述子树替换每个当前叶子,在每种情况下都替换x
,y
和z
在当前叶子中的顺序为a
,b
和c
。
请注意,虽然这适用于您的特定情况,并且会产生最小的树,但在其他情况下追加子树以插入“下一个元素”不会产生最小高度的排序树。例如,要对a,b,c,d,e
进行排序,最小高度应为7,分别为5! = 120
和7^2 = 128
。但是,将e
放入已经排序的4个元素列表中的子树本身至少需要深度3(因为有5个可能的插入位置),因此我们可以轻松构建{{1 }}深度树,但需要另一种方法来构建有效的深度7树。
对于一般讨论,Nick's answer中有关排序网络的链接非常相关:您可以通过从左到右读取网络,为每个连接创建一个节点,然后在在这一点上,将网络的两个变体视为子代:一个已经进行了交换(例如5+3 = 8
为假,所以现在交换了a<b
和a
),而另一个不需要(因为b
)。排序决策树的深度是其排序网络的深度,根据该页面,虽然有 算法可以生成对数深度树/网络(AKS),但绝非易事