[英]Is there a more efficient way to make HashMap with a counter from an ArrayList?
[英]Way to make this HashMap more efficient
我有一个具有3个对象的class User
(?),我不确定该用语。
我正在尝试创建一种方法
我已根据加入的年份(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对元素进行排序。
至于效率:
还有其他数据结构/方法可用于所有方法的O(1)吗?
三个HashMap。 这不是数据库,因此您必须手动维护“索引”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.