将组排序到列表中的决策树
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
项放入结果列表或数组中。
给出一个时间下限,以生成一个由 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
项放入结果列表或数组中。