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