【发布时间】:2015-04-08 11:13:52
【问题描述】:
我们将不胜感激有关如何解决以下问题的任何帮助。我也发布了一些关于这个问题的想法。
您是一个有 n 名学生的班级的助教。你有 他们的最终分数(未排序),您必须为他们分配一个 G 可用等级(A、B、C 等)。约束是(假设 n 是 G的倍数):
- 恰好 (n/G) 学生获得每个成绩(对于 例如,如果 n = 30,并且 G = {A,B,C},那么正好 10 名学生获得 A, 10 分 B,10 分 C)
- 分数较低的学生不会获得 比分数高的学生高(但是,他们可能会得到 相同的成绩)假设每个学生获得不同的分数, 推导出一个有效的算法并以 n 给出其复杂度 和 G. 任何首先对分数进行排序的算法都将收到零 信用。
我的回答: 好的,问题的最后一行说如果我尝试先对数组进行排序并将数组分成 G 等份,我就不好了。当使用最佳排序算法时,这将花费 O(n log n)。所以,我想到了一个复杂的解决方案。我认为这个问题是快速排序可以派上用场的一个例子,因为我们不需要对属于同一年级的学生进行排序,我们可以有 k 个关键元素,并且关键元素都是等距的。 但是,我们没有得到学生的分数,我们也被告知每个学生都有不同的分数。
首先,我使用 MaxMin 分治算法计算最大和最小分数,这需要 O(n) 时间。使用最大值和最小值,我们可以通过计算粗略地找到每个等级的关键要素。 (Max-Min)/k = 最低等级,2*(Max-Min)/k = 第二最低等级。和 k-1*(Max-Min)/k = 最高等级。
现在使用这些作为关键元素,我们可以只执行快速排序的分区方法,第一次需要 n 时间,第二次需要 n-(Max-Min)/k 等等。因此该算法的时间复杂度为 O(n),因为 min-max 问题的复杂度为 O(n),而快速排序中的 Partition 的复杂度为 O(n)。
请分享你的想法。
【问题讨论】:
-
我们有什么具体问题?
-
“假设每个学生都获得了不同的分数,推导出一个有效的算法并根据 n 和 G 给出它的复杂性”我错过了解决这个问题的不同/更好的方法。我的想法是否正确?
-
我不确定这是否有效,因为它假设分数均匀分布在 [min;最大限度]。假设分数是 [1,2,3,4,5,6,20]
-
为什么不用归并排序?我知道在大多数情况下快速排序更有效,但有什么特别的原因吗?
标签: algorithm quicksort divide-and-conquer partial-sort