我正在研究hackerearth上的哈希表,在这里我遇到了使用线性探测实现哈希表的代码。我对这段代码有两个疑问:-
1)为什么他们声明大小为21(而不是大小为20)的hashTable最多容纳20个元素?
2)在插入函数中,如果index的值在连续迭代后变为与Index的初始值相同,则while循环是否会无限期运行?
链接到hackerearth页面:-https://www.hackerearth.com/practice/data-structures/hash-tables/basics-of-hash-tables/tutorial/
Code:-
//declaring a hashTable to hold not more than 20 elements
string hashTable[21];
int hashTableSize = 21;
//Insert function
void insert(string s)
{
//Compute the index using the hash function
int index = hashFunc(s);
/*Search for an unused slot and if the index will exceed the hashTableSize then roll back*/
// I have problem in this loop definition
while(hashTable[index] != "")
index = (index + 1) % hashTableSize;
hashTable[index] = s;
}
答案 0 :(得分:0)
要点1:
这是由于搜索功能。请查看链接的搜索功能。
void search(string s)
{
//Compute the index using the hash function
int index = hashFunc(s);
//Search for an unused slot and if the index will exceed the hashTableSize then roll back
while(hashTable[index] != s and hashTable[index] != "")
index = (index + 1) % hashTableSize;
//Check if the element is present in the hash table
if(hashTable[index] == s)
cout << s << " is found!" << endl;
else
cout << s << " is not found!" << endl;
}
因此,如果他们使用的大小为20,那么如果查询字符串不在哈希表中并且hashTable的每个索引中都有一个字符串,则搜索中的while循环有时会继续无穷大。
要点2:
没有! while循环不会无限运行,因为element / string的数量最多为20,并且给定的数组可以容纳21个elements / string。因此,总会有一个索引,其中hashTable [index]包含“” /空字符串。
注意:
在此算法中,字符串的存储位置由其哈希值决定。但是某些字符串可以具有相似的哈希值。这就是为什么它以循环方式搜索下一个空闲索引。
当它搜索一个字符串是否在哈希表中时,它会搜索到存储空字符串的索引,因为如果该字符串在哈希表中,那么它将至少存储在该空位置。