【问题标题】:(Java) data structure for fast insertion, deletion, and RANDOM SELECTION(Java) 用于快速插入、删除和随机选择的数据结构
【发布时间】:2014-03-04 13:54:14
【问题描述】:

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

  1. myList.添加(项目)
  2. myList.remove(Item.ID) ==> 它实际上需要随机访问
  3. myList.getRandomElement()(等概率)

    --(请注意,getRandomElement() 并不是随机访问的意思,它只是表示:“给我一个随机的物品,以相同的概率”)

请注意,我的项目是独一无二的,所以我不在乎使用的是 List 还是 Set。 我检查了一些 java 数据结构,但似乎没有一个是解决方案:

  1. HashSet 支持 O(1) 中的 1,2,但它不能给我 O(1) 中的随机元素。我需要调用 mySet.iterator().next() 来选择一个随机元素,这需要 O(n)。
  2. ArrayList 在 O(1) 中执行 1,3,但它需要进行线性搜索才能找到我要删除的元素,尽管它需要 O(n)

有什么建议吗?请告诉我应该调用哪些函数?

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

【问题讨论】:

    标签: java performance algorithm data-structures hashset


    【解决方案1】:

    如果内存允许,您可以使用 HashMapArrayList 的组合,如下所示:-

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

    删除:-

    1. 在 HashMap 中检查 num => i
    2. swap(i,arr.size()-1)
    3. HashMap.remove(num)
    4. HashMap(arr[i])=> i
    5. arr.remove(arr.size()-1)

    所有操作都是O(1),但额外O(N)空格

    【讨论】:

      【解决方案2】:

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

      add 可以在 O(1) 中完成,只需添加到数组并将 ID 和索引添加到 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]
      

      【讨论】:

      • 同一时间相同的答案:)
      • 我最喜欢这个,因为它有例子和更详细的文字。
      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2014-02-06
      • 2011-07-09
      • 1970-01-01
      • 2018-11-16
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多