实现功能/持久字典数据结构

时间:2012-04-21 14:06:25

标签: c data-structures functional-programming

我正在尝试在C中实现一个功能字典。实现功能列表或b-tree相当容易,但我几乎找不到关于字典/关联数组的任何引用。

我看了一下erlang的dict实现 - 在他们参考本文的源代码中: The Design and Implementation of Dynamic Hashing for Sets and Tables in Icon

如果有人可以简要解释一下erlang的方法或解决这个问题的方法,那就太好了。

1 个答案:

答案 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也可能会给你一些想法。