【发布时间】:2016-07-14 00:42:11
【问题描述】:
按照我的理解,实现哈希表,就是根据输入的字符串计算索引,然后直接返回,实现简单的键值存储。
如此简单的哈希函数可能看起来像
int hash( string name ){
int index = 0;
int hash = 0;
for ( int i = 0; i < name.length() ;i++){
hash += (int)name[i];
}
index = sizeOfArray % hash;
}
SizeOfArray 是具有预定义大小的指针数组。如果此索引不存在,则创建它。但是我如何用向量来实现呢?
向量没有预定义的大小。它们会自动生长。所以调用 sizeOfArray % hash 会改变每次向量都会增长。
表背后的逻辑是什么?即使随着向量/数组的增长,计算索引的最佳方法是什么?
【问题讨论】:
-
为什么不简单地使用字符串*数组?而且,由于可能存在冲突,您最好使用字符串的链表(或向量)数组,因为多个字符串必须可附加到一个哈希键。顺便说一句,也许你做这个只是为了学习,这非常有用。但是哈希键是编译器附带的许多 STL 数据结构的基础。
-
了解哈希表是个好主意,但不要为了学习目的而实现自己的哈希表,而不是在有
std::unordered_map时。 -
你可以告诉一个向量是一个特定的大小并且它们不会自动增长,除非你调用一个让它们增长的函数。
-
另外,您的索引计算错误,应该反过来:
hash % sizeOfArray。 -
线性散列不会导致查找的线性复杂度,它仍然是常数时间。