给出哈希函数:
public int hash4(int k) {
Random rand = new Random(k);
return rand.nextInt(size);
}
目标是找到使用此散列函数散列到相同散列值的n(大小)数量的键(k)(导致冲突)。大小是一个由用户传入的常量,大小永远不会大于1000.一个键的最大值是n ^ 2,你不能一遍又一遍地使用相同的键。任何帮助将不胜感激!
我尝试解决此问题的过程是使用数字1-n作为键从1循环到n,寻找模式。
答案 0 :(得分:1)
鉴于有n个桶,n 2 键,使用pigeonhole principle,我们知道一个桶至少有n个键
要解决这个问题,我们需要遍历所有键
int keys = n * n;
for(int i = 0; i < keys; i++)
接下来,我们看看哪些键碰撞是将每个键存储在每个碰撞组的列表/集中
List<List<Integer>> collisions = new ArrayList<List<Integer>>(n);
for(int i = 0; i < n; i++)
collisions.add(new LinkedList<Integer>());
collisions.get(hash(key)).add(key);
一旦我们完成所有碰撞,就可以轻松查找至少有n次碰撞的列表
for(List<Integer> collision : collisions)
if(collision.size() >= n)
return collision; //or just print
全部放在一起......
List<Integer> findCollisions(int n)
{
List<List<Integer>> collisions = new ArrayList<List<Integer>>(n);
for(int i = 0; i < n; i++)
collisions.add(new LinkedList<Integer>());
int keys = n * n;
for(int i = 0; i < keys; i++)
collisions.get(hash(i)).add(i);
for(List<Integer> collision : collisions)
if(collision.size() >= n)
return collision;
return null; //this should never happen, due to pigeonholes, but compiler doesn't know
}