我有class User
有3个对象(?)我不确定术语。
我正在尝试创建
的方法我根据加入的年份(2004-2014)创建了10个数组,然后按日期再次对数组中的元素进行排序(按月和日排序)
我认为这意味着方法(3)和(5)具有O(1)
时间复杂度但是(1),(4)和(2)具有O(N)
?
还有另一种数据结构/方法,我可以使用O(1)
来表示我的所有方法吗?我试图重复提出一个,但方法(2)的包含让我难过。
答案 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对元素进行排序。
至于效率:
答案 3 :(得分:0)
还有另一种数据结构/方法可用于为我的所有方法设置O(1)吗?
三个HashMaps。这不是数据库,因此您必须手动维护“索引”。