我正在研究排序算法,并且坚持定理,证明在n向量上的排序算法至少在最坏的情况下具有时间复杂度
n * log2(n)+(1/2)* log2(n)-log2(e)* n + O(1)
您的证明使用引理,该引理指出具有k个叶子的二叉树的高度至少为ceiling(log2(n))。定理指出,您可以使用n!建立二元决策树!叶子并使用斯特林公式得出结果!它应该是排序算法领域中的经典定理。
我的问题是我不知道n如何!叶二叉树正在构建!例如,如果我们要对向量v =(4,3,1)进行升序排序,该如何用3!= 6个叶子构建决策树?
对于可能出现的错误以及未正确使用数学公式表示歉意。
提前感谢大家!
答案 0 :(得分:2)
这里是一个例子:
if (v[0] <= v[1]) {
if (v[1] <= v[2]) {
// Sorted order: v[0], v[1], v[2]
} else {
// v[1] > v[2], so v[1] is a maximal element
if (v[0] <= v[2]) {
// Sorted order: v[0], v[2], v[1]
} else {
// Sorted order: v[2], v[0], v[1]
}
}
} else {
// v[0] > v[1]
if (v[1] > v[2]) {
// Sorted order: v[2], v[1], v[0]
} else {
// v[1] <= v[2], so v[1] is a minimal element
if (v[0] <= v[2]) {
// Sorted order: v[1], v[0], v[2]
} else {
// Sorted order: v[1], v[2], v[0]
}
}
}
此决策树有6个叶子,最多需要3个决策才能到达叶子。
通常,您实际构建决策树的方式称为“排序算法”。如果在所有可能的输入上运行算法,则可以跟踪它如何做出有关交换元素的决策并建立相应的决策树。
答案 1 :(得分:1)
通过排序算法构建决策树很容易。排序算法可以尝试的每个比较将可能的一组命令分为两组。当只剩下一个可能的顺序时,排序算法即告完成。
您实际上将可能的决策以树(<,>)的形式写到(左,右)中。如果横向绘制树,则向上或向下。
a<b?
|
Y-----------N
| |
b<c? a<c?
| |
Y-----N Y-----N
| | | |
(abc) a<c? (bac) b<c?
| |
Y-----N Y-----N
| | | |
(acb) (cab) (bca) (cba)
现在尚未解决的普遍问题是这个。最好的决策树是什么? :-)