Data structures 将密钥插入长度为9的哈希表

Data structures 将密钥插入长度为9的哈希表,data-structures,hashtable,hash-function,mod,Data Structures,Hashtable,Hash Function,Mod,所以,我正在解决一个问题,需要在哈希表中按顺序插入键。因为没有更多的空间,我在20后停止插入。我提供以下图片来帮助理解上下文。我创建了哈希表,找到了冲突数和负载因子。冲突通过开放寻址解决。对不起,这不是一个问题,我只需要有人检查一下,告诉我是否都正确。 你的问题中有许多错误和误解 您声明“20后停止插入”,但显示了15个键 哈希表中有9个存储桶,但您声明负载因子为1。负载系数是键数(15或20)除以铲斗数(9),因此不是1 在散列函数中,h(k,i)k是键,i是桶数。在您的例子中,i是9,因此

所以,我正在解决一个问题,需要在哈希表中按顺序插入键。因为没有更多的空间,我在20后停止插入。我提供以下图片来帮助理解上下文。我创建了哈希表,找到了冲突数和负载因子。冲突通过开放寻址解决。对不起,这不是一个问题,我只需要有人检查一下,告诉我是否都正确。
你的问题中有许多错误和误解

  • 您声明“20后停止插入”,但显示了15个键
  • 哈希表中有9个存储桶,但您声明负载因子为1。负载系数是键数(15或20)除以铲斗数(9),因此不是1
  • 在散列函数中,
    h(k,i)
    k
    是键,
    i
    是桶数。在您的例子中,
    i
    是9,因此函数
    (k mod 9+5i)mod 9
    真的没有意义
  • 所有哈希函数都应以mod i结尾
  • 您提供的键中没有15个碰撞。只有当表中存在上一个值时,才会发生冲突
这一切都在维基百科上的文章中解释过

考虑到此答案下面评论中的澄清,我使用以下代码验证您的结论:

public class Hashing {
    private static final int SIZE = 9;
    private final int[] keys = new int[SIZE];
    private int collisions = 0;

    public void add(int key) {
        int attempt = 0;
        while (keys[hash(key, attempt)] > 0)
            attempt++;
        collisions += attempt;
        keys[hash(key, attempt)] = key;
    }

    private int hash(int key, int attempt) {
        return (key % SIZE + 5 * attempt) % SIZE;
    }

    public static void main(String[] args) {
        Hashing table = new Hashing();
        Stream.of(28, 5, 15, 19, 10, 17, 33, 12, 20).forEach(table::add);
        System.out.println("Table " + Arrays.toString(table.keys));
        System.out.println("Collisions " + table.collisions);
    }   
}
并收到以下输出:

Table [20, 28, 19, 33, 12, 5, 15, 10, 17]
Collisions 15

你的问题中有许多错误和误解

  • 您声明“20后停止插入”,但显示了15个键
  • 哈希表中有9个存储桶,但您声明负载因子为1。负载系数是键数(15或20)除以铲斗数(9),因此不是1
  • 在散列函数中,
    h(k,i)
    k
    是键,
    i
    是桶数。在您的例子中,
    i
    是9,因此函数
    (k mod 9+5i)mod 9
    真的没有意义
  • 所有哈希函数都应以mod i结尾
  • 您提供的键中没有15个碰撞。只有当表中存在上一个值时,才会发生冲突
这一切都在维基百科上的文章中解释过

考虑到此答案下面评论中的澄清,我使用以下代码验证您的结论:

public class Hashing {
    private static final int SIZE = 9;
    private final int[] keys = new int[SIZE];
    private int collisions = 0;

    public void add(int key) {
        int attempt = 0;
        while (keys[hash(key, attempt)] > 0)
            attempt++;
        collisions += attempt;
        keys[hash(key, attempt)] = key;
    }

    private int hash(int key, int attempt) {
        return (key % SIZE + 5 * attempt) % SIZE;
    }

    public static void main(String[] args) {
        Hashing table = new Hashing();
        Stream.of(28, 5, 15, 19, 10, 17, 33, 12, 20).forEach(table::add);
        System.out.println("Table " + Arrays.toString(table.keys));
        System.out.println("Collisions " + table.collisions);
    }   
}
并收到以下输出:

Table [20, 28, 19, 33, 12, 5, 15, 10, 17]
Collisions 15

你到底在问什么?您是希望根据哈希值验证最终表,还是希望获得函数的反馈?需要有人验证我的表。FWIW,我在心里验证了表中的位置,但没有计算碰撞数。我验证了表,因此请接受我的回答。您到底在问什么?您是希望根据哈希值验证最终表,还是希望获得函数的反馈?需要有人验证我的表。FWIW,我在心里验证了表中的位置,但没有计算碰撞次数。我验证了表,因此请接受我的回答。问题陈述得很糟糕,导致了一些误解。我想澄清一下:散列函数中的I意味着计算由冲突引起的重新灰化尝试,即h(k,0)产生第一个要尝试的存储桶,h(k,1)第一个备选存储桶等。。如图所示的表格已满,未成功插入所有请求的键,因此出现了“在(键)20之后停止”和“负载系数1”。最后,提到的15(?)碰撞可能是在填充表格时发生的:例如,h(19,0)==1,它已经被28占据,h(19,1)==6与5发生碰撞…@TonyD ok,现在更有意义了。谢谢。这个问题说得不好,导致了一些误解。我想澄清一下:散列函数中的I意味着计算由冲突引起的重新灰化尝试,即h(k,0)产生第一个要尝试的存储桶,h(k,1)第一个备选存储桶等。。如图所示的表格已满,未成功插入所有请求的键,因此出现了“在(键)20之后停止”和“负载系数1”。最后,提到的15(?)碰撞可能是在填充表格时发生的:例如,h(19,0)==1,它已经被28占据,h(19,1)==6与5发生碰撞…@TonyD ok,现在更有意义了。谢谢