【发布时间】:2015-09-10 10:56:30
【问题描述】:
我有以下学生的相应分数和等级的信息
Name Marks Rank
A 30 1
B 20 2
C 10 3
学生的排名与学生的分数成反比。我必须找到最佳的数据结构来存储上述信息,以便以最佳方式(最佳时间复杂度)执行以下操作。可以假设学生姓名是唯一的。
- 给定学生姓名,查找分数和排名
- 给定等级,找到学生的分数和姓名
- 更新学生的分数。
我正在考虑使用两个哈希映射,一个用于学生和标记映射,另一个用于学生姓名和排名映射。有没有更好的数据结构呢?有没有办法可以利用排名与分数成反比的事实。
【问题讨论】:
-
哈希图对于您要查找的操作(平均而言)是 O(1),因此您无法击败它。然而,它们需要空间。您可以做的是:创建一个具有名称、标记(?一个或多个)、排名的类。然后是两个用于 name 和 rank 的 hashmaps 指向该用户的类。昂贵但有效。
-
另一种选择是有一个 Name + Marks 的 Comparable 类,一个按排名自动排序的比较方法,以及一个简单的 List 来存储它们。优点:更新排名是自动的,需要的空间更少,代码可能更易于阅读。缺点:比 hashmap 慢,访问不再是 o(1)。
-
为什么不使用
class Student字段name和marks并通过marks对学生列表进行反向排序来获得排名?您还可以添加一个属性rank,该属性会在每次列表排序时重置。 -
基本列表不太适合排序。为什么每次都对列表进行排序,而您可以使用最大堆优先级队列或类似的东西;-)。
-
你应该使用某种排序的地图,使用你的班级学生,它应该有字段来存储姓名、分数和排名。理想情况下,这应该实现
Comparable并覆盖compare方法,以便地图可以进行比较。我希望TreeMap应该这样做。
标签: java algorithm data-structures time-complexity