我几天前开始阅读有关实现各种数据结构的文章,碰到了哈希表的一点问题。
我对哈希表的理解是:传递一个键K给哈希函数H,它会返回一个经过哈希处理的键HK。由于可能会出现冲突,HK至少应该是一个uint32_t类型。我们有一个大小为X的数组,在这个数组中,项目存储在索引HK处。但是,这是否需要预先分配长度为至少uint32_t(或H的返回值)的数组呢?假设我们不在该数组中存储数据本身,而是存储指向数据的指针,则我们需要一个长度为uint32_t的ptr_t数组。这似乎非常浪费,在64位系统上将导致内存使用量达到: 2 ^ 32 * 8 = 34359738368字节或约32GB,仅用于数据指针的数组,这显然不是实际实现的方式。
那么我错在哪里了?
我对哈希表的理解是:传递一个键K给哈希函数H,它会返回一个经过哈希处理的键HK。由于可能会出现冲突,HK至少应该是一个uint32_t类型。我们有一个大小为X的数组,在这个数组中,项目存储在索引HK处。但是,这是否需要预先分配长度为至少uint32_t(或H的返回值)的数组呢?假设我们不在该数组中存储数据本身,而是存储指向数据的指针,则我们需要一个长度为uint32_t的ptr_t数组。这似乎非常浪费,在64位系统上将导致内存使用量达到: 2 ^ 32 * 8 = 34359738368字节或约32GB,仅用于数据指针的数组,这显然不是实际实现的方式。
那么我错在哪里了?