Java 使此HashMap更高效的方法
我有一个Java 使此HashMap更高效的方法,java,arrays,performance,sorting,hashmap,Java,Arrays,Performance,Sorting,Hashmap,我有一个类用户,它有3个对象(?)我不确定术语 一个(int)ID代码 创建用户的(int)日期 和一个(字符串)名称 我正在尝试创建一个 将用户添加到我的数据结构(1) 根据用户的ID号返回用户的名称(2) 返回按日期排序的所有用户的完整列表(3) 返回名称包含特定字符串的用户列表,按日期排序(4) 返回在特定日期之前加入的用户列表(5) 我根据加入的年份(2004-2014)制作了10个数组,然后按日期再次对数组中的元素进行排序(先按月排序,然后按天排序) 我认为这意味着方法(3)和
类用户
,它有3个对象(?)我不确定术语
- 一个(int)ID代码
- 创建用户的(int)日期
- 和一个(字符串)名称
- 将用户添加到我的数据结构(1)
- 根据用户的ID号返回用户的名称(2)
- 返回按日期排序的所有用户的完整列表(3)
- 返回名称包含特定字符串的用户列表,按日期排序(4)
- 返回在特定日期之前加入的用户列表(5)
O(1)
时间复杂度,但是(1)、(4)和(2)具有O(N)
,这是正确的吗
还有没有另一种数据结构/方法,我可以用来为我的所有方法设置O(1)
?我反复尝试提出一个方法,但方法(2)的加入让我感到困惑;它的主要用途/优点是提供近O(1)查找(您可以通过ID进行查找)。如果需要对某些内容进行排序,应该让类实现,将其添加到列表中,并使用对元素进行排序
至于效率:
三个散列图。这不是一个数据库,所以您必须手工维护“索引”。基于比较的排序始终是O(N*logn),添加到已排序容器中的是O(logn)。为了避免这种情况,你需要水桶,就像你现在多年来使用水桶的方式。这将以内存换取执行时间 (1) 仅当您仅向
HashMap
s添加内容时,才可以为O(1)
(2) 如果您有一个单独的HashMap
将ID映射到用户,则可以是O(1)
(3) 当然是O(N),因为您需要列出所有N个用户,但是如果您有一个HashMap
,其中key是日期,value是用户列表,那么您只需要通过常量(10年*365天+2)数组来列出所有用户。所以O(N)(1)仍然是O(1)。假设用户在一天内未分类
(4) 对于简单的实现,基本上与3相同,只是打印更少。你也许可以用一个trie或者别的什么来加速最好的情况,但它仍然是O(N),因为它肯定是N的%匹配
(5) 与(3)相同,您可以更快地进行排序。基于比较的排序始终是O(N*logn),添加到已排序容器中的是O(logn)。为了避免这种情况,你需要水桶,就像你现在多年来使用水桶的方式。这将以内存换取执行时间 (1) 仅当您仅向
HashMap
s添加内容时,才可以为O(1)
(2) 如果您有一个单独的HashMap
将ID映射到用户,则可以是O(1)
(3) 当然是O(N),因为您需要列出所有N个用户,但是如果您有一个HashMap
,其中key是日期,value是用户列表,那么您只需要通过常量(10年*365天+2)数组来列出所有用户。所以O(N)(1)仍然是O(1)。假设用户在一天内未分类
(4) 对于简单的实现,基本上与3相同,只是打印更少。你也许可以用一个trie或者别的什么来加速最好的情况,但它仍然是O(N),因为它肯定是N的%匹配
(5) 与(3)相同,您可以更快地爆发。您必须做出妥协,并对最常见的操作进行知情猜测。最常见的操作很可能是通过ID查找用户。因此,HashMap是实现这一点的理想结构:它是O(1),以及插入到映射中 要实现按日期排序的用户列表,以及给定日期之前的用户列表,最好的数据结构是树集。树集已经排序(因此第三个操作将是O(1),并且可以在O(log(n))时间内返回已排序的子集 但是,与HashMap并行维护一个树集是很麻烦的,容易出错,并且需要占用内存,而且插入的复杂性将变为O(log(N))。如果这些不是常见的操作,您可以简单地对条目进行迭代并对其进行筛选/排序。绝对不要考虑您的10个数组。这是不可维护的,而TreeSet是一个更好、更简单的解决方案,不限于10年
包含给定字符串的按名称列出的用户列表是O(N),无论您选择何种数据结构。您必须做出妥协,并对最常见的操作进行有根据的猜测。最常见的操作很可能是按ID查找用户。因此,哈希映射是最理想的结构:它是O(1),以及插入到地图中 要实现按日期排序的用户列表和给定日期之前的用户列表,最好的数据结构是树集。树集已经排序(因此第三个操作将是O(1),并且可以在O(log(n))时间内返回已排序的子集 但是与HashMap并行地维护树集