我正在实施名为“提交历史记录”的内容。使用Java并有以下几种方法:
//查找给定学生的任何提交的最高成绩
public Integer getBestGrade ( String unikey );
//给定学生的最新提交
public Submission getSubmissionFinal ( String unikey );
//给定学生在指定时间之前的最新提交
public Submission getSubmissionBefore ( String unikey , Date deadline );
//添加新提交(可以假设来自一个学生的提交有不同的时间)
public Submission add ( String unikey , Date timestamp , Integer grade );
//删除提交(可以假设来自一个学生的提交有不同的时间)
public void remove ( Submission submission );
//获得所有成绩最高的学生
public List < String > listTopStudents ();
//获取所有最近提交的成绩低于其最佳成绩的学生
public List < String > listRegressions ();
然而,我需要关注的主要问题是时间复杂性。理想情况下,每种方法都需要比O(n)更好(除了最后两种方法)。例如,当使用双向链表时,插入和删除只需要O(1),但是,它需要O(n)进行搜索。另一方面,当使用B树时,需要O(log n)进行搜索。那么,我想问的是,是否可以同时使用多个数据结构(最多3个)?另外,哪种数据结构适合每种方法?(我在考虑树图...)谢谢!
答案 0 :(得分:1)
我建议您使用HashMap<String, TreeMap<Date, Submission>>
作为数据结构。
然后你可以:
getBestGrade
:在O(1)中查找所有提交给学生的内容,然后在O(N)中找到最佳提交(您可以通过缓存最佳分数来提高)。getSubmissionFinal
:在O(1)中查找所有提交给学生的内容,然后在O(1)中找到最后一个getSubmissionBefore
:在O(1)中查找所有提交给学生的内容,然后在O(1)中找到结果add
:在O(1)中为学生查找或添加提交,然后在O(log(N))中添加提交(如果实施缓存,则应在此处更新缓存)remove
在O(1)中找到或添加学生提交的内容,然后在O(log(N))中删除提交(如果您实施缓存,则应在此处更新缓存)listTopStudents
在这里你需要遍历所有提交(如果你没有在getBestGrade
中实现缓存),这是O(N)listRegressions
通过学生进行迭代,检查条件会给你O(N)总数(再次缓存会帮助你)