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

哈希实现中的线性探测

暨曾笑
2023-03-14

我试图解决这个问题,我需要实现线性探测。

给定一个整数数组和一个哈希表大小。使用线性探测将数组元素填充到哈希表中以处理冲突。

例1:

Input:
hashSize = 10
sizeOfArray = 4
Array[] = {4,14,24,44}

Output:
-1 -1 -1 -1 4 14 24 44 -1 -1

例2:

Input:
hashSize = 10
sizeOfArray = 4
Array[] = {9,99,999,9999}

Output:
99 999 9999 -1 -1 -1 -1 -1 -1 9

您的任务:
您不需要读取输入或打印任何内容。

您的任务是完成函数linearProbing(),该函数将空哈希表(hash)、哈希表大小(hashSize)、整数数组arr[]及其大小N作为输入,并将数组arr[]的所有元素插入给定的哈希表中。

哈希表的空单元格将被赋予-1的值。此外,如果没有更多的空间来插入新元素,只需删除该元素。

期望时间复杂度:O(N)。
期望辅助空间:O(1)。

制约因素:

1 <= hashSize <= 100
1 <= sizeOfArray <= 100
0 <= Array[] <= 105

我写的代码是:

static int[] linearProbing(int hash_size, int arr[], int N) {
    int[] a = new int[hash_size];
    for(int i = 0; i < hash_size; i++)
        a[i] = -1;
    for(int i = 0; i < N; i++) {
        int probe = arr[i] % hash_size;
        int offset = 1;
        while(a[probe] != -1) {
            probe = (probe + offset) % hash_size;
        }
        a[probe] = arr[i];
    }
    return a;
}

给定的html" target="_blank">测试用例正在运行。但是当我提交的时候,我得到的是一份工作。请帮忙。

驱动程序代码如下所示=https://i.stack.imgur.com/ULVdd.png

共有1个答案

谢阳成
2023-03-14

你漏掉了一个点,当数组大小大于哈希表时,只需跳过其余的。

这也可能是一个简单的问题,只需将N替换为hash_size并迭代即可。只要arr包含元素,就可以进行迭代

static int[] linearProbing(int hash_size, int arr[], int N) {
    //This is what was missing from your code
    int iterating_size = N>hash_size? hash_size : N;

    int[] a = new int[hash_size];
    for(int i = 0; i < hash_size; i++)
        a[i] = -1;
    int started = -1;
    for(int i = 0; i < iterating_size ; i++) {
        int probe = arr[i] % hash_size;
        int offset = 1;
        while(a[probe] != -1) {
            probe = (probe + offset) % hash_size;
        }
        a[probe] = arr[i];
    }
    return a;
}

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

  • 我在研究hackerearth上的哈希表,在那里我遇到了用线性探测实现哈希表的代码。我对这段代码有两个疑问:- 1)为什么他们声明大小为21(而不是大小为20)的hashTable最多容纳20个元素? 2) 在Insert函数中,当循环无限运行时,如果在连续迭代之后,索引的值变为索引的初始值,不是吗? 链接至黑客主页:-https://www.hackerearth.com/practice/da

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

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

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

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