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

前端之家收集整理的这篇文章主要介绍了实现功能/持久字典数据结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试用C实现一个函数字典.实现函数列表或b-tree相当容易,但我几乎找不到关于字典/关联数组的任何引用.

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

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

解决方法

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,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也可能会给你一些想法.

原文链接:https://www.f2er.com/c/119351.html

猜你在找的C&C++相关文章