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

标签 java performance algorithm data-structures hashset

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

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

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

    <

请注意,我的项目是唯一的,所以我不关心是否使用了 ListSet。 我检查了一些java数据结构,但似乎没有一个是解决方案:

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

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

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

最佳答案

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

  1. Store numbers in ArrayList arr as they come.
  2. Use HashMap to give mapping arr[i] => i
  3. While generating random select random form arrayList

删除:-

  1. check in HashMap for 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) 空间

关于java - (Java) 快速插入、删除和随机选择的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21622911/

相关文章:

Java 8 并行运行多个方法

sql - 优化 MySQL 查询以避免 "Using where; Using temporary; Using filesort"

c++ - 用于字符串匹配算法的大 O 表示法

algorithm - 有一个双向图,删除连接某些节点的路径的最佳方法?

java - 创建 osgi 包时使用 Elasticsearch 时出错

java - 如果我不访问该应用程序,则不会收到通知

java - IntelliJ IDEA 调试器在 macOS 上启动太慢

mysql - 比较多个字段的算法

java - 访问游标时出现异常

c++ - 为什么使用 'if' 语句可以提供更好的性能?