【问题标题】:Amazon.com Student Final ScoreAmazon.com 学生最终成绩
【发布时间】:2013-02-10 21:47:37
【问题描述】:

这个问题是针对 Amazon.com 面试的在线测试。确切的问题是:

给定一个测试结果列表(每个都带有测试日期、学生 ID 和学生的分数),返回每个学生的最终分数。学生的最终分数是他/她的 5 个最高考试分数的平均值。您可以假设每个学生至少有 5 个考试成绩。

为您的解决方案使用以下框架

class TestResult{
   int studentId;
   Date testDate;
   int testScore;
}

public Map<Integer, Double> getFinalScores(List<TestResult> resultList){
   return null;
}

我的解决方案是这样的:

  • 我创建了一个名为 studentIdToResultSet 的 HashMap&lt;Integer, SortedSet&lt;TestResult&gt;
  • Comparator 将比较结果中的 testScore,并为较高的分数返回 1,以便从高到低排序。
  • 遍历给定的结果列表并将所有测试结果放入映射中(检查条目是否存在,如果存在:添加到集合中,如果不存在:使用新集合创建条目并将结果添加到列表中。
  • 遍历 HashMap,对于每个条目,我都会遍历前 5 个集合条目并获得平均值,然后将其放入另一个 HashMap,我最终将其返回。

现在是我的问题:

  1. 我不知道我的解决方案的复杂性 (O) 是什么。我最好的猜测是 O(n+n),但我不确定。
  2. 这个问题有更优化的解决方案吗?
  3. 如果我在问题中添加一个约束条件,即返回的地图必须按照学生排名的顺序进行迭代,该怎么办?

附:我看到有人在@Calculating the average?之前问过这个问题,但他很不清楚,并没有提供骨架。如果这违反了发布规则,我提前道歉。

【问题讨论】:

  • O(n+n) 减少到 O(n)
  • 在列表中?获得五个最高的测试结果...最终得分是“五个最好”的场景...

标签: java algorithm sorting amazon complexity-theory


【解决方案1】:

使用大小为 5 的 minHeap

复杂度:O(klogn),k =5 ==> O(logn)。和 O(n+m) ,通常 = O(max(n,m) 。在你的情况下它是 O(n)。

【讨论】:

  • 最初,堆是空的,我们有一个size = 5。每次我们看到标记
  • 你是对的。这是保证每次堆操作的恒定时间的正确方法。喜欢。
  • 谢谢!是否有 MinHeap 的 Java 实现?我什至没有想过要编写自己的结构。另外,感谢您对复杂性的澄清
  • @KartikeBhagat 很高兴为您提供帮助。你是哪个大学的?
  • @Droider:我也有同样的问题。我在java中使用了priorityqueue实现。我认为应该足够了。因为优先队列大小将始终为 5。
【解决方案2】:

您的算法似乎具有 O(nLog (n)) 时间复杂度。您的树可以有任何大小,包括最坏情况下的 n。您可以使用每个学生 ID 的最小堆,而不是使用树。每次添加第六个项目时,删除最小值,使其始终保持最好的 5 个分数。

正如 Droider 解释的那样,这样可以保证 n 中的线性时间。

【讨论】:

  • 并跟踪最小值。只有当分数大于设定的最小值时,分数才会成为替换的候选。
  • @DoSparKot:我认为这种优化没有真正的好处(特别是在时间复杂度方面)
  • 是的,它不会影响时间复杂度。
  • 感谢您的解释。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2011-01-10
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多