如何在堆上组织数据结构

时间:2013-10-27 23:54:46

标签: c linked-list

现在我的结构对于我必须做的项目看起来像这样:

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指向的是什么。此数据格式应该是具有链接列表的表。

图表会有所帮助。

谢谢你。

1 个答案:

答案 0 :(得分:0)

您的Table对象有:

(a)两位成员持有尺码信息:key_counttable_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来保存一个冗余的密钥成员。