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

Java 用于比较具有最常见属性的项目的高效数据结构,java,data-structures,Java,Data Structures,我需要一个关于以下问题的有效数据结构的建议 我有两份学生名单(男学生和女学生),以及他们已经参加的各自的课程(按日期排序)。名单上已经按字母顺序排列了他们的姓、名 用户将给出一个学生名,即学生X,程序需要做的是找到哪个男学生或女学生与学生X共享的课程最多。听起来您需要这样做。关联数组将某种类型的关键对象映射到另一个对象,可能是不同类型的对象。它通常被称为“地图”,因为它就是这样做的。映射可以由实现,这意味着您有固定的时间查找键->对象映射。我建议用两个哈希表来解决这个问题。第一个将学生姓名映射到

我需要一个关于以下问题的有效数据结构的建议

我有两份学生名单(男学生和女学生),以及他们已经参加的各自的课程(按日期排序)。名单上已经按字母顺序排列了他们的姓、名

用户将给出一个学生名,即学生X,程序需要做的是找到哪个男学生或女学生与学生X共享的课程最多。

听起来您需要这样做。关联数组将某种类型的关键对象映射到另一个对象,可能是不同类型的对象。它通常被称为“地图”,因为它就是这样做的。映射可以由实现,这意味着您有固定的时间查找键->对象映射。我建议用两个哈希表来解决这个问题。第一个将学生姓名映射到所选课程列表的人。第二种方法是将班级名称映射到上课的学生。你的学生->班级查找会很快,你的班级->学生查找列表也会很快。此外,在处理特定的学生X时,可以使用第三个将学生名映射为整数,计算他们与学生X共享一个类的次数。这将是一个非常有效的实现

最重要的是,它最终可能是一个非常简单的实现。关系映射是一项非常常见的任务,关联数组非常有用,许多语言都内置了关联数组,或者在标准库中内置了关联数组。Python有它的字典,Perl有散列,java有一个哈希映射(和许多其他类型的映射),C++有STD::MAP,虽然它不支持哈希表,也没有固定的时间访问。除非您被禁止在本练习中使用您的语言标准库,否则您在运行有效的解决方案时不会遇到太多问题。

我会这样做:

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;
}
类Clazz{
日期和时间;
字符串名;
} 
班级学生{
她是女性;
字符串名;
地图分类;
}
列出学生=。。。
公共学生findMostShared(谁的学生){
学生最大值=空;
int maxCount=0;
(学生:学生){
如果(s==who){continue;}
int c=0;
对于(Clazz:s.classesTaken.values()){
if(who.classesTaken.containsKey(z.when)){
C++;
}
}
如果(c>maxCount){
最大计数=c;
max=s;
}
}
返回最大值;
}

到目前为止,您想到了什么?将每个列表放在各自的数组中。每个数组元素保存另一个数组,其中包含按日期排序的类列表。在列表中找到学生X并复制其班级列表。将每个学生与其班级列表进行比较。但这似乎效率不高。“最有效”的意思是“最快运行”是指所有答案都已预先计算好的问题:其中,对于每个问题(即每个学生X),您已经有了相关的答案(即与学生X同班最多的男或女学生)。最有效的结构可能是一个字典,每个学生都有一个键,每个对应的值都有相应的答案。计算“共享类”的数量类似于计算两个集合的交集大小的问题(因此谷歌搜索Java中的一种方法来查找两个集合的交集).男女学生的区别有什么原因吗?这难道不是学生阶级的财产吗?你能展示一些代码吗?+1来描述哈希表,但是我不确定我会使用第二个映射来解决这个问题。你为什么不使用第二个映射呢?您需要高效地查找谁在使用特定的类,因此使用映射是一个合乎逻辑的选择。