(Java)用于快速插入、删除和随机选择的数据结构

(Java)用于快速插入、删除和随机选择的数据结构,java,performance,algorithm,data-structures,hashset,Java,Performance,Algorithm,Data Structures,Hashset,我需要一个数据结构来支持O(1)中的以下操作: 我的列表。添加(项目) myList.删除(Item.ID)==>它实际上需要随机访问 myList.getRandomElement()(概率相等) --(请注意getRandomElement()并不意味着随机访问,它只是意味着:“以相同的概率随机给我一个项目”) 请注意,我的项目是唯一的,所以我不在乎是否使用了列表或集合。 我检查了一些java数据结构,但它们似乎都不是解决方案: HashSet支持O(1)中的1,2,但它不能在O(1)中给我

我需要一个数据结构来支持O(1)中的以下操作:

  • 我的列表。添加(项目)
  • myList.删除(Item.ID)==>它实际上需要随机访问
  • myList.getRandomElement()(概率相等)

    --(请注意getRandomElement()并不意味着随机访问,它只是意味着:“以相同的概率随机给我一个项目”

  • 请注意,我的项目是唯一的,所以我不在乎是否使用了列表或集合。 我检查了一些java数据结构,但它们似乎都不是解决方案:

  • HashSet支持O(1)中的1,2,但它不能在O(1)中给我一个随机元素。我需要调用mySet.iterator().next()来选择一个随机元素,它取O(n)
  • ArrayList在O(1)中执行1,3操作,但它需要进行线性搜索才能找到要删除的元素,尽管需要O(n)
  • 有什么建议吗?请告诉我应该调用哪些函数


    如果java没有这样的数据结构,我应该使用哪种算法来实现这一目的?

    您可以将
    HashMap
    (从ID到数组索引)与数组(或
    ArrayList
    )结合使用

    add
    可以在O(1)中完成,只需添加到数组中,并将ID和索引添加到
    HashMap

    remove
    可以在O(1)中完成,方法是从
    HashMap
    中进行查找(和删除)以查找索引,然后将数组中的最后一个索引移动到该索引,更新
    HashMap
    中该元素的索引,并将数组大小减小一

    getRandomElement
    可以通过从数组返回随机元素在O(1)中完成

    示例:

    数组:[5,3,2,4]
    HashMap:[5->0,3->1,2->2,4->3]
    
    删除3项:

    在HashMap中查找(并删除)键3(给出3->1)
    交换数组中的最后一个元素3和4
    将HashMap中4的索引更新为1
    将数组的大小减少1
    数组:[5,4,2]
    HashMap:[5->0,2->2,4->1]
    
    添加6:

    只需将其添加到数组和HashMap中即可
    数组:[5,4,2,6]
    HashMap:[5->0,2->2,4->1,6->3]
    
    如果内存允许,您可以组合使用HashMapArrayList,如下所示:-

  • 将数字存储在ArrayList arr中
  • 使用HashMap给出映射arr[i]=>i
  • 生成随机选择随机表单arrayList时
  • 删除:-

  • 为num=>i签入HashMap
  • 交换(i,阵列大小()-1)
  • HashMap.remove(num)
  • HashMap(arr[i])=>i
  • arr.remove(arr.size()-1)

  • 所有的操作都是
    O(1)
    但是额外的
    O(N)
    space

    在同一时间回答相同:)我最喜欢这个,因为它有示例和更详细的文本。