在一次采访中,有人问我,你有两个对象,学生和课程,他们之间存在着多对多的关系。一名学生可以报名参加一门以上的课程,可以有很多学生报名参加一门课程。设计一个有效的数据结构来存储这些数据,记住搜索的时间复杂度应该是最佳的。搜索可以是针对单个课程注册的学生列表,也可以是单个学生注册的课程列表。
我回复说我们可以使用两个HashMaps,一个用于StudentName - >课程列表查找和一个课程名称 - >学生列表查找。对于这两种情况,搜索将在O(1)中。
缺点:如果学生的课程发生变化(您必须更新课程名称地图中的条目),您需要使用大量内存并且需要进行簿记。但这不是问题,搜索不能比O(1)更好。
请告知您最好的数据结构
答案 0 :(得分:1)
如果您不需要范围查找(例如"返回名称从" B" 开始的学生访问的所有课程),则提供的数据结构为理想。唯一可以改进的是将List
替换为HashSet
,以便在保证的O(1)中进行更新/删除操作。
Map<Student, Set<Course>> studentsToCources; // HashMap, HashSet
Map<Course, Set<Student>> coursesToStudents; // HashMap, HashSet
当然,这些地图必须封装在某个类中,其中职责是在两个地图上对呼叫者透明地执行操作。