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)
我根据加入的年份(2004-2014)制作了10个数组,然后按日期再次对数组中的元素进行排序(先按月排序,然后按天排序)

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

还有没有另一种数据结构/方法,我可以用来为我的所有方法设置
O(1)
?我反复尝试提出一个方法,但方法(2)的加入让我感到困惑;它的主要用途/优点是提供近O(1)查找(您可以通过ID进行查找)。如果需要对某些内容进行排序,应该让类实现,将其添加到列表中,并使用对元素进行排序

至于效率:

  • O(1)
  • O(1)
  • O(n日志n)
  • O(n)(至少)
  • O(n)(或更少,但我认为必须是O(n))
  • A不分类任何东西;它的主要用途/优点是提供近O(1)查找(您可以通过ID进行查找)。如果需要对某些内容进行排序,应该让类实现,将其添加到列表中,并使用对元素进行排序

    至于效率:

  • O(1)
  • O(1)
  • O(n日志n)
  • O(n)(至少)
  • O(n)(或更少,但我认为必须是O(n))
  • 还有没有另一种数据结构/方法,我可以使用它为我的所有方法设置O(1)

    三个散列图。这不是一个数据库,所以你必须手工维护“索引”

    还有没有另一种数据结构/方法,我可以使用它为我的所有方法设置O(1)


    三个散列图。这不是一个数据库,所以您必须手工维护“索引”。

    基于比较的排序始终是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并行地维护树集