【问题标题】:Using a hash table to create an unlimited array使用哈希表创建无限数组
【发布时间】:2011-03-07 17:36:20
【问题描述】:

我目前正在用 C 开发一种编程语言,我希望允许用户创建具有数字索引的明显“无限”数组,而不会牺牲过程中的性能。例如,table [1000000000] 理想情况下是可以立即创建和访问的,而不会产生包含 1,000,000,000 个项目的表的内存开销,其中 999,999,999 个未使用;但是当 table [n] 被定义为 1 ≤ n ≤ 1000000 时,该数组也会表现良好。

您对实现这样一个数组处理系统有什么建议吗?

【问题讨论】:

    标签: c arrays hashtable


    【解决方案1】:

    使用 cmph 无济于事。您需要提前知道所有键才能创建(最小)完美哈希函数。

    你想要的是一个简单的关联映射结构,它可以让你实现一个稀疏数组。任何哈希表或树结构都可以。您可以使用 c++ stl 实现或任何类似数据结构中的开箱即用的 hash_map 或映射。

    如果你想花哨,你可以使用 Judy Arrays,但我怀疑它不会有任何区别,除非你能正确地对东西进行基准测试,并且愿意考虑更复杂的数据结构来对你的特定用例进行假设。

    做简单的事。最简单的可用哈希表是最好的答案。甚至不用考虑哈希函数之类的东西,无论您的平台提供什么都可以很好地工作。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        我想你自己已经回答过了。 看看CMPH - C Minimal Perfect Hashing Library

        编辑:

        或者您可以使用B+ Tree 将整数映射到数组中的实际索引。使用B Trees 还有一个好处:可以进行范围查询。

        【讨论】:

        • 你已经有了一个完美的哈希函数,在这个例子中就是索引。
        • 一个完美的散列函数不要求事先知道键(例如,将月份一月...十二月映射到 1...12)?
        【解决方案4】:

        理论上我认为这是可能的。您需要的是非常好的散列算法(以避免冲突)。所以如果有人说 table[100..0];您无需立即分配空间。根据需要分配空间。因此,如果在 table[100..0] 中我试图填充前 5 个值,那么我将只存储这五个值,如果我尝试访问让我们说 table[100] 那么我应该得到类似“undef”的东西或'nil' ....

        the_void 提到的库似乎不错...虽然我还没有测试过... :)

        【讨论】:

          【解决方案5】:

          您正在创建一个 Sparse Array,正如 Wikipedia 文章中提到的那样,这些可以由一个链接列表表示。

          链表中的每个节点都可以是一个动态分配的数组,这样您就不会因连续索引而承受过多的开销。

          【讨论】:

          • 稀疏数组可能效率更低,get/set 复杂度为 O(N) - N 实际项目数 (itl.nist.gov/div897/sqg/dads/HTML/hugeSparseArray.html)
          • 为什么投反对票?据我所知,这 is 是一个稀疏数组,我并不是建议@the_void 链接到的实现,而是作为可能随着时间统一的数组的链接列表
          【解决方案6】:

          如何使用指针,你不必为它定义元素的数量,你可以添加任意数量的元素

          【讨论】:

            猜你喜欢
            • 2016-09-21
            • 1970-01-01
            • 1970-01-01
            • 2012-06-17
            • 1970-01-01
            • 1970-01-01
            • 2011-04-20
            • 2015-01-17
            • 1970-01-01
            相关资源
            最近更新 更多