将组排序到列表中的决策树

Decision tree of sorting groups into a list

给出一个时间下限,以生成一个由 n 个数字组成的排序列表,这些数字属于 k 组。这样最小的n/k排在第一位,依此类推。

所以我一直被这个问题困住了一段时间,我真的不确定该如何解决。我知道如何制作决策树,但我不明白在这个问题的背景下我应该怎么做。我不一定理解这个问题,但它似乎很清楚,可以为人们解决。任何指向正确方向或澄清的观点都将不胜感激。

您的问题很难,因为它假设 n 个数字已被分成 k 个组,并且这些组本身是有序的。我在这里假设每组中的数字是 而不是 排序的。如果数字已经在每个组中排序,就会使问题变得微不足道。

解决您问题的决策树可以用 k 个子树构建,每组一个,每个子树连接到下一个子树。这样做的原因是组本身已经排序好了,我们只需要对每个组进行排序即可。如果我们只需要沿着 一条 路径遍历这棵树以找到正确的叶节点(和排序列表),就会出现下限 运行 时间。这意味着下界是树的高度,即:

O(k * lg n/k)

分解这个表达式:

lg n/k是每个k子树的高度

k * lg n/k是完整决策树的高度(有k个子树)

请阅读此 excellent PDF from the CS 401 class at the University of Illinois at Chicago,它将完全解释您的原始问题,并向您展示我如何得出上面给出的 Big Omega 表达式的证明。

我不确定问题中的 "lower bound" 是什么。

如果

(...) numbers that are in k groups. Such that the smallest n/k are first and so on.

表示组已经排序(按正确顺序给出),然后

the time to produce a single sorted list

如果组内的数字已经排序,则

是最小值。然后生成排序列表的最短时间是 k*(n/k-1) + k*(n/k) + (k-1) = O(n+k),用于测试每个 'k' 组是否已排序,通过按顺序附加每个项目将每个组转换为链表,然后将组连接成单个结果列表或数组。

另一方面,如果我们想要构建结果所需的最短时间,尽管输入数字在组中的初始(缺乏)顺序,那么答案是 O(k*(n/k)*ln(n/k)) + n = O(n*ln(n/k)) 对于一般算法排序 k 将每个 n/k 项分组,然后将所有 n 项放入结果列表或数组中。