使用哈希表创建无限数组

时间:2010-06-24 09:48:56

标签: c arrays hashtable

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

您对这种阵列处理系统的实施有什么建议吗?

6 个答案:

答案 0 :(得分:1)

您正在创建Sparse Array,正如维基百科文章所提到的,这些可以通过链接列表来表示。

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

答案 1 :(得分:1)

答案 2 :(得分:0)

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

修改

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

答案 3 :(得分:0)

如何使用指针,您不必为其定义元素数量,您可以根据需要添加任意数量的元素

答案 4 :(得分:0)

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

<_> the_void提到的库似乎很好......虽然我没有测试过......:)

答案 5 :(得分:0)

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

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

如果你想要花哨,你可以使用Judy Arrays,但我会怀疑它会有什么不同,除非你能够正确地对东西进行基准测试,并且愿意考虑更复杂的数据结构,这些结构将对你的特定用例做出假设。

做一件简单的事。最简单的可用哈希表是最佳答案。甚至不用考虑哈希函数等,无论你的平台提供什么都可以运行得很好。