给出时间的下限,以生成k个组中n个数字的单个排序列表。这样最小的n / k是第一个,依此类推。
所以我一直坚持这个问题一段时间,我真的不确定如何去做。我知道如何制作决策树,但我不明白我应该如何在这个问题的背景下做到这一点。我不一定能理解这个问题,但似乎很明显可以为人们解决。任何指向正确的方向或澄清都将非常感激。
答案 0 :(得分:1)
您的问题很难,因为它假设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表达式的证明。
答案 1 :(得分:0)
我不确定什么是"下限"在问题中。
如果
(...)k组中的数字。这样最小的n / k是第一个,依此类推。
表示组已经排序(按正确顺序给出),然后
如果组内的数字已经排序,则生成单个排序列表的时间
是最小的。然后,生成排序列表的最短时间为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
项,然后将所有{{1}}项放在结果列表或数组中。