【发布时间】:2020-08-27 19:21:55
【问题描述】:
我正在尝试重新散列已使用单独链接方法实现的哈希表。 我有哈希表的每个桶的链表,当负载因子(#nodes/#buckets)大于 0.75 时需要调整表的大小和重新哈希表 我尝试将原始表的每个桶的尾部复制到一个临时表中并释放先前为表分配的内存(map-> hashtable)然后通过将大小加倍来增加表的大小。然后我 malloc 一个新表(链表结构数组)在调整大小和重新散列过程后存储条目。 该函数的目的是向表中添加一个条目。我不确定如何在新表中重新散列原始表的节点。这是我为检查尺寸所做的。任何提示将不胜感激
size_t index = (map->hash_func(k)) % (map->size_map);
float load_factor = map->node_count / map->size_map ;
if (load_factor >= 0.75) {
struct linked_list *temp_array = malloc(sizeof(struct linked_list) * map->size_map);
for (int i = 0; i < map->size_map) {
temp_array[i].tail = map->hashtable[i].tail;
}
free(map->hashtable);
map->size_map *= map->size_map;
map->hashtable = malloc(sizeof(struct linked_list) * map->size_map);
【问题讨论】:
-
你有什么问题?你没有得到想要的行为吗?您的描述中的一些观察结果:(1)您不需要将现有的存储桶复制到新的临时内存中。只需在释放之前使用旧内存。 (2)“我试图只复制每个桶的尾部”——你的意思是每个桶的头部,不是吗? (3)
map->size_map *= map->size_map-- 每次调整大小时将桶数平方。这将很快变得巨大。 (更常用的方法是每次将大小加倍。) -
您的
for (int i = 0; i < map->size_map) {循环中缺少; i++部分