Java中同时有多个数据结构

时间:2017-09-15 03:52:46

标签: java data-structures big-o

我正在实施名为“提交历史记录”的内容。使用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个)?另外,哪种数据结构适合每种方法?(我在考虑树图...)谢谢!

1 个答案:

答案 0 :(得分:1)

我建议您使用HashMap<String, TreeMap<Date, Submission>>作为数据结构。

然后你可以:

  1. getBestGrade:在O(1)中查找所有提交给学生的内容,然后在O(N)中找到最佳提交(您可以通过缓存最佳分数来提高)。
  2. getSubmissionFinal:在O(1)中查找所有提交给学生的内容,然后在O(1)中找到最后一个
  3. getSubmissionBefore:在O(1)中查找所有提交给学生的内容,然后在O(1)中找到结果
  4. add:在O(1)中为学生查找或添加提交,然后在O(log(N))中添加提交(如果实施缓存,则应在此处更新缓存)
  5. remove在O(1)中找到或添加学生提交的内容,然后在O(log(N))中删除提交(如果您实施缓存,则应在此处更新缓存)
  6. listTopStudents在这里你需要遍历所有提交(如果你没有在getBestGrade中实现缓存),这是O(N)
  7. listRegressions通过学生进行迭代,检查条件会给你O(N)总数(再次缓存会帮助你)