【问题标题】:What abstract data type is this?这是什么抽象数据类型?
【发布时间】:2018-02-19 00:53:38
【问题描述】:

以下是常见的数据类型(即它有名称吗)?

与普通的Set 不同的是,它的独特之处在于它包含初始化时的“宇宙”,内存开销为O(C),最大内存开销为O(N/2)(仅当您删除every-other 时才会发生这种情况元素):

> s = new Structure(701)
s = Structure(0-700)

> s.remove(100)
s = Structure(0-99, 101-700)

> s.add(100)
s = Structure(0-700)

> s.remove(200)
s = Structure(0-199, 201-700)

> s.remove(202)
s = Structure(0-199, 201, 203-700)

> s.removeAll()
s = Structure()

这样的东西有标准名称吗?

【问题讨论】:

  • Range tree?此处的删除操作相当于范围树中的节点拆分 + 调整大小操作。
  • 是什么让您认为如此具体的事物会有名字?这听起来像是对可以实现这一目标的实现的一种变相的无研究请求。
  • 没有名字,但是关于如何实现这个的一些想法:stackoverflow.com/questions/39522165/…
  • @Dukeling 已经在 Scala 中实现了这个(我知道标准集合库中没有这样的东西)。只是想为我的类型取一个像样的名字(以前叫它SparseRange)。
  • 我称它为游程编码的位向量,因为它的语义是位向量,并且它的打印表示显示了连续的块。

标签: algorithm collections abstraction abstract-data-type


【解决方案1】:

我过去曾多次使用过它,并看到它用于多边形裁剪的平面扫描算法等。

有时它所代表的抽象数据类型只是一个集合,数据结构是一种优化。例如,我用它来表示由 [^a-zA-z0-9.-] 等正则表达式给出的匹配字符集,并对这些集执行交集、并集和其他操作。

这种数据结构是在其他一些有序集合或映射结构之上实现的,只需存储集合中成员资格发生变化的键而不是集合本身中的键。在我见过的所有其他案例中,作者都​​参考了底层结构,而不是为概念本身命名。

不过,我喜欢给它起个名字的想法,因为正如我所说,我自己已经用过很多次了。也许我会称之为“进出组合”,以纪念我吃汉堡时最喜欢的汉堡连锁店。

【讨论】:

    【解决方案2】:

    这是Compressed Bit SetCompressed Bitmap

    Bit SetBitmap 是专门为存储Integers 而设计的集合。大多数语言都提供了这些的标准实现。它们通常通过将1 分配给Integers 的内部数组中的Nth 位来工作,其中N 是您要添加到集合中的数字。 0 表示该值不存在。这些类型的Bit Sets 的内存使用量取决于您存储的最大数量。

    Compressed Bit Set 是一个压缩了0s 和1s 的范围。

    在这种情况下,问题演示了一种称为“运行长度编码”的压缩类型(谢谢@Ralf Kleberhoff),所以它特别是Run-length Encoded Bitmap

    Compressed Bitmaps 的常见实现(从最新到最旧)是:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 2018-02-11
      • 2022-01-09
      • 2023-01-28
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多