现在我的结构对于我必须做的项目看起来像这样:
typedef struct bucket {
char *key;
void *value;
struct bucket *next;
} Bucket;
typedef struct {
int key_count;
int table_size;
void (*free_value)(void *);
Bucket **buckets;
} Table;
有人可以向我解释结构是如何组织的吗?就像我想知道Bucket **buckets
指向的是什么。此数据格式应该是具有链接列表的表。
图表会有所帮助。
谢谢你。答案 0 :(得分:0)
您的Table
对象有:
(a)两位成员持有尺码信息:key_count
和table_size
(b)一个函数指针free_value
,它不带任何参数并且不返回任何内容。据推测,它与Table
(c)并回答你的问题:Bucket **buckets;
是一个指针数组,每个指针都指向Bucket
的链接列表。
@Charlie在评论中添加的链接应该教你更多关于哈希表的信息。
这个想法很简单:你想在表中存储一堆values
,但是你不喜欢搜索整个表来查找条目。给定N
值,您需要花费O(N)
(将天真表视为单个链表)。
您认为可以通过称为“哈希函数”的自定义函数“哈希”此value
来生成“key
”并改为存储key-value
对。 / p>
这样,当您需要查找value
时,您会找到其哈希值(即key
),并将您带到Bucket
的链接列表。此列表中的每个Bucket
都包含key-value
对。您遍历列表直到找到您的价值。
如果您的自定义哈希函数足够智能,无法将多个值哈希到同一个key
,则可以将查找时间缩短到远小于O(N)
的值。
将其视为将values
传播到多个单个链接列表中,并且能够通过哈希函数知道要在O(1)
时间内遍历哪个列表。
编辑:我刚刚注意到您的Bucket
结构有一个键和值字段。我上面解释的内容使用key
来查看values
的链接列表。因此,我对列表的概念不需要key
作为成员,因为它实际上只是一个价值链。
我想知道为什么当它有下一个指针时你需要Bucket
来保存一个冗余的密钥成员。