我必须设计和实现一个数据结构,就像bimap
, bidimap
or dualmap
,即哈希表,其中的值可以用来提取键,当然还有相反的方向。
通常,它可以在两个独立的哈希表之上实现,但有一些特定的要求:
- 操作期间的最小内存分配(最好仅在启动时分配所有内存)
- 共享相同的数据(如果实现为两个哈希表)
- 条目数的上限已知
- 键和值可以是任何数据结构(通用),但长度在启动时是固定的
- 只有 C,没有 STL,从头开始
- 支持删除操作
到目前为止,我所拥有的是:
typedef struct HashTable {
int key_len;
int data_len;
int num_buckets;
HashEntry *buckets;
} HashTable;
typedef struct HashEntry {
void* key;
void* data;
HashEntry* next; //list for collision resolution
} HashEntry;
HashTable* createHashTable (int max_capacity, int num_buckets, int key_len, int data_len);
所以计划是创建两个哈希表,每个哈希表都是一个桶数组。
在每个桶中预分配长度条目列表max_capacity / num_buckets
然后分配字节数组来共享数据并作为内存池:
char* p = malloc((key_len+data_len) * max_capacity)
;
然后 put 函数会将键和数据放入字节数组中,并且两个哈希表都会相应地分配key
和data
指针。
主要挑战来自
- 冲突(桶中的数量超过预期,需要额外分配)
- 去掉内存池的操作和管理
您将如何改进设计以应对这些挑战?