我正在尝试在C中实现一个功能字典。实现功能列表或b-tree相当容易,但我几乎找不到关于字典/关联数组的任何引用。
我看了一下erlang的dict实现 - 在他们参考本文的源代码中: The Design and Implementation of Dynamic Hashing for Sets and Tables in Icon
如果有人可以简要解释一下erlang的方法或解决这个问题的方法,那就太好了。
答案 0 :(得分:6)
C中持久数据结构的实现与函数式语言的实现基本相同。 Chris Okasaki的Purely Functional Data Structures是一个很好的参考。
通常,将固定宽度的整数映射到对象就足够了,因为 虽然这本身并没有给你一个完整的字典,你可以在上面建立一个字典:使用实际键的哈希作为底层地图的键,并让叶子指向(键,值的列表) )对相同的哈希值。
棘手的部分是内存管理,因为您通常不知道数据结构的某些部分何时无法访问。幸运的是,由于大多数持久性数据结构都基于树,因此引用计数通常很有效。为了能够管理数据结构引用的对象,可以为叶子节点的引用计数变为0时调用的回调提供挂钩。
例如,我的位图Patricia Trees的C实现提供了以下API:
// Querying
void *bpt_get(bpt_t bpt, bpt_key_t key);
bool bpt_has_key(bpt_t bpt, bpt_key_t key);
// Adding and Removing Entries
bpt_t bpt_assoc(bpt_t bpt, bpt_key_t key, void *item);
bpt_t bpt_dissoc(bpt_t bpt, bpt_key_t key);
// Managing Memory
void bpt_retain(bpt_t bpt);
void bpt_release(bpt_t bpt);
void bpt_dealloc(bpt_t bpt);
void bpt_set_dealloc_hook(bpt_t bpt,
bpt_key_t key,
void (*hook)(bpt_key_t key,
void* value));
// Iteration
void bpt_for_mappings(bpt_t bpt,
void (*thunk)(bpt_key_t, void*, void*),
void *user_data);
// Making a Map Persistent (you can elide this if you don't
// want to support transients)
void bpt_seal(bpt_t bpt);
implementation也可能会给你一些想法。