如何使这个HashMap更有效率

时间:2014-02-24 22:37:19

标签: java arrays performance sorting hashmap

我有class User有3个对象(?)我不确定术语。

  • 一个(int)ID代码
  • 创建用户的(int)日期
  • 和(字符串)名称

我正在尝试创建

的方法
  • 将用户添加到我的数据结构(1)
  • 根据用户的ID号(2)
  • 返回用户名
  • 返回按日期排序的所有用户的完整列表(3)
  • 返回名称具有特定字符串的用户列表,按日期排序(4)
  • 返回在特定日期(5)之前加入的用户列表

我根据加入的年份(2004-2014)创建了10个数组,然后按日期再次对数组中的元素进行排序(按月和日排序)

我认为这意味着方法(3)和(5)具有O(1)时间复杂度但是(1),(4)和(2)具有O(N)

还有另一种数据结构/方法,我可以使用O(1)来表示我的所有方法吗?我试图重复提出一个,但方法(2)的包含让我难过。

4 个答案:

答案 0 :(得分:2)

基于比较的排序总是O(N * log N),并且添加到已经排序的容器是O(log N)。为了避免这种情况,你需要水桶,就像你现在拥有水桶一样多年。这会将内存换成执行时间。

只有当你只向HashMap添加内容时,

(1)才能为O(1)。

(2)如果你有一个单独的HashMap将ID映射给用户,则可以是O(1)。

(3)当然是O(N),因为你需要列出所有N个用户,但如果你有一个HashMap,其中key是日期,而value是用户列表,你只需要经历常量(10年* 365天+ 2)列出所有用户的数组数。所以O(N)与(1)仍然是O(1)。假设用户在一天内未分类。

(4)与简单实现基本相同,只需少量打印。您可以使用 trie 或其他东西来加速最佳情况,但它仍然是O(N),因为它将确定N匹配的百分比。

(5)与(3)相同,你可以早点爆发。

答案 1 :(得分:2)

您必须妥协,并对最常见的操作做出明智的猜测。最常见的操作很可能是通过ID查找用户。因此,HashMap是理想的结构:它是O(1),以及插入到地图中。

要实现按日期排序的用户列表以及给定日期之前的用户列表,最佳数据结构将是TreeSet。 TreeSet已经排序(因此您的第3个操作将是O(1),并且可以在O(log(n))时间内返回已排序的子集。

但是将TreeSet与HashMap并行维护是很麻烦,容易出错并且会花费内存。插入复杂度将变为O(log(N))。如果这些不是常见的操作,您可以简单地遍历条目并过滤它们/对它们进行排序。绝对忘记你的10个阵列。这是不可维护的,TreeSet是一个更好更容易的解决方案,不限于10年。

无论您选择哪种数据结构,按名称包含给定字符串的用户列表都是O(N)。

答案 2 :(得分:0)

HashMap不排序任何东西;其主要目的/优势是提供近O(1)查找(您可以使用ID进行查找)。如果您需要对某些内容进行排序,则应该使用类实现Comparable,将其添加到List中,并使用Collections.sort对元素进行排序。

至于效率:

  1. O(1)
  2. O(1)
  3. O(n log n)
  4. O(n)(至少)
  5. O(n)(或更少,但我认为它必须是O(n))

答案 3 :(得分:0)

  

还有另一种数据结构/方法可用于为我的所有方法设置O(1)吗?

三个HashMaps。这不是数据库,因此您必须手动维护“索引”。