用于比较具有最常见属性的项目的高效数据结构

时间:2009-07-08 02:01:39

标签: java data-structures

我需要针对以下问题提出有效数据结构的建议。

我有两个学生名单(男性和女性),他们已经参加了各自的课程(按日期排序)。该列表已经按字母顺序排列,并使用其姓氏,名字。

用户将提供学生姓名,即。学生X,以及该计划需要做的是找到哪个男生或女生与学生X分享最多的课程。

2 个答案:

答案 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;
}