【问题标题】:storing the data in effective data structure so that search would be fast将数据存储在有效的数据结构中,以便快速搜索
【发布时间】:2015-05-09 09:38:15
【问题描述】:

在一次采访中,有人问我给你两个对象,学生和课程,它们之间存在多对多关系。一个学生可以注册不止一门课程,也可以有很多学生注册一门课程。设计一个有效的数据结构来存储这些数据,记住搜索的时间复杂度应该是最佳的。可以搜索单个课程注册的学生列表,也可以搜索单个学生注册的课程列表。

我回答说我们可以使用两个 HashMap,一个用于 StudentName -> Course List Lookup,另一个用于 Course Name -> Student List Lookup。对于这两种情况,搜索都将在 O(1) 中进行。

缺点:你会占用大量内存,如果学生的课程发生变化,你需要记账(你必须更新课程名称映射中的条目)。但这不是问题所在,我猜搜索不会比 O(1) 更好。

你能告诉我什么是最好的数据结构吗

【问题讨论】:

  • IMO 您的解决方案平均会在恒定时间内工作,这是一个理想的解决方案。就性能而言,搜索也永远不会比常数 O(1) 更好,但常数因素有时会根据输入大小而无法达到目的。

标签: java data-structures


【解决方案1】:

如果您不需要范围查找(例如,“返回所有学生访问过的名称以“B”开头的课程),提供的数据结构是理想的。唯一可以改进的是替换List HashSet 以使更新/删除操作也在保证的 O(1) 中运行。

Map<Student, Set<Course>> studentsToCources;  // HashMap, HashSet
Map<Course, Set<Student>> coursesToStudents;  // HashMap, HashSet

当然,这些映射必须封装在某个类中,该类的职责是对调用者透明地对两个映射执行操作。

【讨论】:

  • 也许你可以使用 student-id 而不是整个学生对象作为键。同样适用于课程。
  • 从设计的角度来看,将此数据结构封装在一个类中,该类将负责必要的簿记,这样客户就不必担心不一致。
  • @akhil_mittal 当然映射到 ID 会执行得更快,因为哈希码的计算速度更快,但这不会反映在 O 复杂度中
  • @wannabeprogrammer 当然,我认为这很明显,不需要解释:)
  • 在那种情况下我很好:)
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多