使用线性探测在哈希表中插入

时间:2019-07-09 08:38:31

标签: c++ hash linear-probing

我正在研究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;
    }

1 个答案:

答案 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]包含“” /空字符串。

注意:

在此算法中,字符串的存储位置由其哈希值决定。但是某些字符串可以具有相似的哈希值。这就是为什么它以循环方式搜索下一个空闲索引。

当它搜索一个字符串是否在哈希表中时,它会搜索到存储空字符串的索引,因为如果该字符串在哈希表中,那么它将至少存储在该空位置。