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

时间:2014-02-07 08:37:41

标签: java performance algorithm data-structures hashset

我需要一个支持 O(1)

中的以下操作的数据结构
  1. myList中。添加(项目)
  2. myList。删除(Item.ID) ==>它实际上需要随机访问
  3. myList。 getRandomElement()(概率相同)

    - (请注意,getRandomElement()并不意味着随机访问,它只是意味着:“随机提供其中一项,概率相同”

  4. 请注意,我的商品是唯一的,因此我不关心是否使用列表设置。 我检查了一些java数据结构,但似乎没有一个是解决方案:

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

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

2 个答案:

答案 0 :(得分:6)

如果内存允许,您可以使用 HashMap ArrayList 的组合: -

  
      
  1. 将数字存储在ArrayList arr中。
  2.   
  3. 使用HashMap提供映射arr [i] =>我
  4.   
  5. 生成随机选择随机形式arrayList
  6.   

删除: -

  
      
  1. 在HashMap中检查num =>我
  2.   
  3. swap(i,arr.size() - 1)
  4.   
  5. HashMap.remove(num)
  6.   
  7. HashMap中(ARR [I])=>我
  8.   
  9. arr.remove(arr.size() - 1)
  10.   

所有操作均为O(1),但额外O(N)空间

答案 1 :(得分:5)

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

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

HashMap

remove可以在O(1)中通过从HashMap执行查找(和删除)来查找索引,然后将数组中的最后一个索引移动到该索引,更新HashMap中元素的索引,并将数组大小减一。

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

示例:

Array: [5,3,2,4]
HashMap: [5->0, 3->1, 2->2, 4->3]

删除3:

Look up (and remove) key 3 in the HashMap (giving 3->1)
Swap 3 and, the last element, 4 in the array
Update 4's index in the HashMap to 1
Decrease the size of the array by 1

Array: [5,4,2]
HashMap: [5->0, 2->2, 4->1]

添加6:

Simply add it to the array and HashMap

Array: [5,4,2,6]
HashMap: [5->0, 2->2, 4->1, 6->3]