【发布时间】:2011-07-09 22:51:51
【问题描述】:
我正在寻找一个关联集合,它支持在至少 O(Log(N)) 时间内通过键检索和插入值(删除不重要),并且在代码方面具有非常低的内存开销大小和运行时内存消耗。
我正在为一个用 C 编写的小型嵌入式应用程序执行此操作,因此我试图最大限度地减少所需的代码量和消耗的内存量。
Google sparse hash data structure 如果不是用 C++ 编写的,那么它是可能的,并且更简单。
我知道的大多数哈希表实现都使用大量额外空间,至少需要两倍于键值总数的空间,或者每个条目需要额外的指针(例如桶链哈希算法) .在我的结构中,键值对只是两个指针。
目前我正在使用一个已排序的键/值对数组,但插入是 O(N)。我不禁认为必须有一个聪明的方法来改善插入的摊销运行时间,例如通过分组插入,但我没有任何成功。
我认为这在某些圈子中一定是一个比较知名的问题,所以为了让这个不太主观,我想知道上述问题最常见的解决方案是什么?
[编辑:]
一些可能相关的附加信息:
- 键是整数
- 值的数量可能很小,从 1 到 2^32。
- 使用模式是不可预测的。
- 我希望尽可能降低内存消耗(例如,将所需内存大小增加一倍,这并不理想)
【问题讨论】:
-
您的工作量如何?预期的元素数量是多少?你的元素的大小是多少?键总是整数吗?字符串?还是无效*?这是我要问的许多问题中的一部分。
-
看到你已经回答了我的一些问题,我想问更多:你可以使用动态分配吗?你的动态分配器效率高吗(快速?碎片内存邪恶?开销?)你能负担得起偶尔的繁重计算吗?如果存在值,您会进行大量测试,还是您几乎确定所有请求的键都存在?你能负担得起 O(log²(n)) 吗?你不知道你的工作量也是令人惊讶的。如果您的程序依赖于外部输入,那么您应该使用混合工作负载进行基准测试。如果您的程序不完整,请不要优化。
标签: c data-structures memory-management hashtable associative-array