我需要针对以下问题提出有效数据结构的建议。
我有两个学生名单(男性和女性),他们已经参加了各自的课程(按日期排序)。该列表已经按字母顺序排列,并使用其姓氏,名字。
用户将提供学生姓名,即。学生X,以及该计划需要做的是找到哪个男生或女生与学生X分享最多的课程。
答案 0 :(得分:2)
听起来你需要Associative Arrays。关联数组将某种类型的关键对象映射到另一个对象,可能是另一种类型。它通常被称为“地图”,因为它就是它的作用。地图可以通过Hash Table实现,这意味着您可以不断查找密钥 - >对象映射。我实际上建议2个哈希表来解决这个问题。第一个将学生姓名映射到所选课程列表。第二个是将班级名称映射到上课的学生。你的学生 - >班级查找会非常快,而你的班级 - >学生列表查找也会很快。此外,当您处理特定学生X时,您可以使用第三个学生将学生姓名映射到一个整数,计算他们与学生X共享课程的次数。这将最终成为一个非常有效的实施。
最重要的是,它可能最终成为一个非常简单的实现。关系映射是一项常见任务,关联数组非常有用,许多语言都内置它们,或者在标准库中。 Python有它的字典,Perl有它的散列,Java有一个HashMap(以及许多其他类型的映射),C ++有std :: map,虽然它没有哈希表支持,也没有恒定的时间访问。除非您禁止在本练习中使用您的语言标准库,否则在运行有效的解决方案时不会有太多麻烦。
答案 1 :(得分:0)
我会这样做:
class Clazz {
Date when;
String name;
}
class Student {
boolean isFemale;
String name;
Map<Date, Clazz> classesTaken;
}
List<Student> students = ...
public Student findMostShared(Student who) {
Student max = null;
int maxCount = 0;
for (Student s : students) {
if (s == who) { continue; }
int c = 0;
for (Clazz z : s.classesTaken.values()) {
if (who.classesTaken.containsKey(z.when)) {
c++;
}
}
if (c > maxCount) {
maxCount = c;
max = s;
}
}
return max;
}