任何有关如何解决以下问题的帮助将不胜感激。我也发布了一些关于这个问题的想法。
你是一个有 n 名学生的班级的助教。您有他们的最终分数(未排序),您必须为他们分配 G 可用等级之一(A、B、C 等)。约束是(假设 n 是 G 的倍数):
- 恰好 (n/G) 名学生获得每个成绩(例如,如果 n = 30,并且 G = {A,B,C},则正好 10 名学生获得 A,10 名学生获得 B,10 名学生获得 C)
- 分数较低的学生不会比分数较高的学生获得更高的分数(但是,他们可能会得到相同的分数)假设每个学生获得不同的分数,推导出一个有效的算法并给出其复杂度G. 任何首先对分数进行排序的算法都将获得零分。
我的回答:好的,问题的最后一行说,如果我尝试先对数组进行排序并将数组分成 G 等份,我就不好了。当使用最佳排序算法时,这将花费 O(n log n)。所以,我想到了一个复杂的解决方案。我认为这个问题是快速排序可以派上用场的一个例子,因为我们不需要对属于同一年级的学生进行排序,我们可以有 k 个关键元素,并且关键元素都是等距的。但是,我们没有得到学生的分数,我们也被告知每个学生都有不同的分数。
首先,我使用 MaxMin Divide and Conquer Algorithm 计算最大和最小分数,这将花费 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)。
请分享你的想法。