【问题标题】:What's the name of this array data structure?这个数组数据结构叫什么名字?
【发布时间】:2013-04-11 21:38:18
【问题描述】:

有一个对研究项目有用的数据结构的想法,并想看看它是否已经有一个名称或 STL 等价物:

创建一个大小为n 的稀疏数组作为sqrt(n) 指针数组。

要在i 处插入项目,请转到i/sqrt(n) 处的指针。如果该指针是null,则将其分配给大小为sqrt(n) 的新数组。将您的项目插入新数组的位置i mod sqrt(n)。

优点很简单:它允许您创建一个最初只占用O(sqrt(n)) 空间的大型数组。您可以在恒定时间内访问任何元素,它允许您填充数组的某些部分,而无需为所有 n 位置分配空间。

这可能已经用于哈希表分桶,我想到了另一个应用程序(在非常大的 DNA 序列中记忆重叠群)。我的问题是:这个有名字吗?我可以使用任何常见的实现吗?

【问题讨论】:

标签: arrays algorithm data-structures


【解决方案1】:

它本身不是数据结构。看来这种技术可以用在其他集合类型的数据结构中。

编辑: 它绝对是一种存储或组织数据的机制,但我一直将数据结构与存储/检索(读/写)机制相关联。

【讨论】:

  • 为什么这不算数据结构?
  • 我只是想你可以用它来实现一个向量、列表,或者你有什么。
【解决方案2】:

此数据结构与hashed array tree (HAT) 数据结构密切相关。散列数组树的结构类似于您上面描述的内容 - 您有一个大小为 √n 的顶级数组,其中每个条目都是指向具有 √n 个元素的数组的指针。这使得插入和查找相当快,并且与传统动态数组的 O(n) 内存开销相比,只有 O(√n) 内存开销。

您的结构在某些方面与 HAT 不同。对于初学者来说,如果您需要更多空间,您的结构似乎无法扩展结构,而 HAT 被设计为可增长的。此外,您的结构允许随机插入,而 HAT 是为顺序插入而设计的。也就是说,没有根本原因 HAT 必须以这种方式运行,因此您可以将数据结构视为对 HAT 的轻微修改。事实上,您可能想看看 HAT 如何增长,以使您的数据结构支持增长。

希望这会有所帮助!

【讨论】:

  • 我认为 HAT 是我正在寻找的东西 - 它显然比我想象的更精致,但我预计无论出现什么情况都会如此。
【解决方案3】:

它也和Van Emde Boas Tree的第一层非常相似。

Van Emde Boas 树在第一层存储 sqrt(n) 指针,但在较低层有额外的树,而不是像这个问题中的简单数组。

【讨论】:

    【解决方案4】:

    好吧,我将其称为 带有行向量的方阵。 如果没有完全填充,它是带有行向量的 稀疏 方阵。1.

    这里有两个优化。第一个是稀疏内存分配,第二个是行下标计算的strength reduction。对于超大规模 CPU 乱序执行指令以及编译器经常进行全局流优化的时代,这种优化可能并不那么重要。

    但它确实允许通过指针取消引用而不是乘以行大小来进行行索引。


    1.然而,在数值分析中,稀疏矩阵是一个大部分为零的矩阵,因此稀疏数据结构在形式上具有相同的定义。在这种情况下,它更像是一个部分数据结构,但据我所知,这些东西还没有被接受的术语。

    【讨论】:

    • 是的,这是一个非常奇怪的描述。可能有人试图迷惑他的学生:-)
    • 这是一个哈希表,具有非常简单的 has 函数,仅适用于 ints。
    • @ArgumentNullException 如果函数是 1:1 映射,这并不是真正的哈希。另外,除了动态(二维)数组之外,我绝对不会将其称为其他任何东西,好吧,也许是动态稀疏数组。
    • 我不同意你的“强度降低”论点。此数据结构的公共接口采用单个索引,而不是行/列对;行下标计算只是必要的,因为您首先执行了逆运算。
    • 或者换一种说法:如果你使用单个(平面)数组,索引是最小的base+index*element_size。如果将数组拆分,会减少内存使用,但不会降低索引到数组的成本,而是增加它,因为现在您需要 divmod 操作将索引拆分为行和列索引(并且您支付间接成本的额外成本,这很容易大大超过索引计算成本)。
    【解决方案5】:

    我称之为分段数组。我在将句柄映射到指针时使用这些。

    【讨论】:

      【解决方案6】:

      这是一个桶数组。

      Java 的 hastable 实现就是这样一个“基于桶的哈希表”。
      这是buckets 的图形

      还有其他结构,如四叉树,也使用这种桶。

      在您的情况下,您有 sqrt(n) 个存储桶。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2011-04-07
        相关资源
        最近更新 更多