当前位置: 首页 > 知识库问答 >
问题:

使用线性探测插入哈希表

姚永年
2023-03-14

我在研究hackerearth上的哈希表,在那里我遇到了用线性探测实现哈希表的代码。我对这段代码有两个疑问:-

1)为什么他们声明大小为21(而不是大小为20)的hashTable最多容纳20个元素?

2) 在Insert函数中,当循环无限运行时,如果在连续迭代之后,索引的值变为索引的初始值,不是吗?

链接至黑客主页:-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个答案

沙岳
2023-03-14

要点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,那么如果查询字符串不在哈希表中,并且哈希表的每个索引中都有一个字符串,那么while循环有时会继续搜索无穷大。

要点2:
不!虽然循环不会无限运行,因为元素/字符串的数量最多为20个,给定的数组可以容纳21个元素/字符串。所以哈希表[索引]总是有一个索引保存“”/空字符串。

注:

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

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

 类似资料:
  • 我正在用一个字符串数组单维和一个2维int数组制作哈希表。我正在使用线性探测进行冲突检测,当我意识到如果检测到冲突,单词的hashCode将不再是索引时,我真的很兴奋地完成了这个程序。我该如何保存该索引以备以后使用?

  • 我试图解决这个问题,我需要实现线性探测。 给定一个整数数组和一个哈希表大小。使用线性探测将数组元素填充到哈希表中以处理冲突。 例1: 例2: 您的任务: 您不需要读取输入或打印任何内容。 您的任务是完成函数linearProbing(),该函数将空哈希表(hash)、哈希表大小(hashSize)、整数数组arr[]及其大小N作为输入,并将数组arr[]的所有元素插入给定的哈希表中。 哈希表的空单

  • 小明的通讯录 小明上中学了,为了方便和家里以及同学联系,爸爸终于给小明买了一台手机。该手机的存储容量可以扩充,因此,可以存储的电话号码数量没有限制。 小明的手机有一个特殊的功能,对于打进或拨出的电话,只要是新号码,手机均会自动进行储存。 给定小明在一个月的使用期间的手机通讯记录,请给出此时此刻小明的手机中存储了多少个电话号码。 输入格式: 本题只有一组测试数据。第一行先输入一个整数N( N不超过1

  • 我在做一个程序,比较哈希表中线性探测、二次探测和单独链接所需的平均访问量和最大访问量。 我已经做了三个案例的元素插入部分。当从哈希表中找到元素时,我需要有一个结束搜索的限制。在单独链接的情况下,当下一个指针为空时,我可以停止。对于线性探测,当探测到整个表时,我可以停止(即表的大小)。在二次探测中,我应该用什么作为限制?表大小可以吗? 我的二次探测函数是这样的 其中i从0到无穷大。请帮帮我...

  • 我试图理解使用Java实现的线性探测哈希表。然而,我对理解为什么M的初始值为30001感到失望。下面给出了代码的框架。 我的问题是为什么M在这里被初始化为30001。这是经验法则吗?初始化线性探测哈希表时,我应该如何确定M的大小?

  • 线性探测(哈希表)有一件事对我来说并不直观。如果我把散列结果的key1放到数组索引1中。然后我放了钥匙2- 或者,我们的散列函数(如果写得足够好的话)在索引中平均分配键,并且我们不断调整数组的大小,使其最大半满,这就减轻了这种情况?