繁体   English   中英

使此HashMap更有效的方法

[英]Way to make this HashMap more efficient

我有一个具有3个对象的class User (?),我不确定该用语。

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

我正在尝试创建一种方法

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

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

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

还有其他数据结构/方法可用于所有方法的O(1)吗? 我反复尝试提出一种方法,但是方法(2)的包含使我感到困惑。

基于比较的排序始终为O(N * log N),添加到已排序的容器为O(log N)。 为了避免这种情况,您需要使用存储桶,就像现在使用存储桶一样。 这用内存换取执行时间。

(1)仅在将事物添加到HashMap时才可以是O(1)。

如果您具有将ID映射到用户的单独的HashMap ,则(2)可以为O(1)。

(3)当然是O(N),因为您需要列出所有N个用户,但是如果您有一个HashMap ,其中key是天,值是用户列表,则只需要经过常数(10年* 365天) + 2)列出所有用户的数组数。 因此(1)的O(N)仍为O(1)。 假设用户一天之内未排序。

(4)基本实现与3相同,实现简单,只需要较少的打印。 您也许可以使用trie之类的东西来加快最好的情况 ,但是它仍然是O(N),因为它将确定N的一定百分比会匹配。

(5)和(3)一样,您可以早点爆发。

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

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

但是,与HashMap并行维护TreeSet既麻烦又容易出错,并且会占用内存。 并且插入复杂度将变为O(log(N))。 如果这些不是常见的操作,则可以简单地遍历条目并对其进行过滤/排序。 绝对不用担心10个数组。 这是无法维持的,并且TreeSet是一个更好,更轻松的解决方案,不限于10年。

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

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))

还有其他数据结构/方法可用于所有方法的O(1)吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM