【问题标题】:Data structure for set operations集合操作的数据结构
【发布时间】:2012-07-30 00:13:37
【问题描述】:

什么数据结构在时间和空间上都有效地支持以下集合操作?

  1. 联合
  2. 区别
  3. 是成员
  4. 添加
  5. 删除

我可以想到 3 种不同的方式来做这些操作,假设我们有两个集合,它们的大小都是 N:

位数组:

1. O(N)  2.O(N)  3.O(1)  4.O(1)  5.O(1)

哈希表:

1. O(N)  2.O(N)  3.O(1)  4.O(1)  5.O(1)

有序树

1. O(NlogN)  2.O(NlogN)  3.O(logN)  4.O(logN)  5.O(logN)

Bit Array 和 HashTable 速度快但占用内存过多,Ordered Tree 速度慢但占用内存少。

请注意:集合中可能包含除整数以外的其他类型,如浮点数或字符串

还有哪些数据结构既快速又通用,又节省空间?

【问题讨论】:

  • 您尝试使用此数据结构的应用程序是什么?
  • 如果您正在考虑使用 JAVA,这可能会有所帮助 docs.oracle.com/javase/6/docs/api/java/util/Set.html
  • 为什么哈希表(哈希集)不能像有序树一样保存任意(但可比较)对象?
  • 对于日志分析,并不是所有的操作都需要,但我很好奇。
  • @Ted Hopp 你是对的,我犯了一个错误。

标签: algorithm data-structures language-agnostic


【解决方案1】:

一种选择是使用布隆过滤器扩充您的有序树,以加快 ismemberof 类型测试。

认为整体行为类似于:

1. O(N log(N) )  2. O( ? )  3.O(1)  4.O(log(N))  5.O( log(N) )

但具体细节取决于过滤器的大小、集合的大小和域的大小。

另一个选项可能是Judy Arrays。对于这种用途,我听说过它们的好消息,但没有亲身经历。

另一个选项是forrest approach(而不是纯二叉树)。

【讨论】:

  • bloom 过滤器可能会误报?
  • 是的,它当然可以——但它的否定总是有效的。因此,如果树返回正数,则搜索树,但如果树返回负数,则避免遍历树。
  • 我会研究 judy 数组,看起来很有趣
【解决方案2】:

我建议Binary Heap(最简单的一个)、Binomial Heap(加速联合)和Fibonacci Heap(最难实施,但对于标准操作具有最广为人知的摊销时间)。

操作 二叉堆 二项式堆 斐波那契堆(摊销)
1. 工会 O(n)                            O(logn)                                O(1)
2. 区别              O(nlogn)                       O(nlogn)                              O(nlogn)
3. find(ismemberof)     O(n)                             O(n)                                               O(n)
4. 添加                         O(lgn)                          O(lgn)                                   O(1)
5. 删除                     O(lgn)                                                                 O(lgn)

但是,这些结构主要用于需要 插入、查找/提取 min(max)、联合删除 操作的情况。 finddiff 操作的运行时间仍然很短。

【讨论】:

    【解决方案3】:

    您也可以查看Union-Find Data Structure

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2019-06-13
      • 1970-01-01
      • 2019-08-09
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多