布谷鸟哈希函数的参数_CuckooHash(布谷鸟散列)

概念:

定义:

CuckooHash(布谷鸟散列)是为了解决哈希冲突问题而提出,利用较少的计算换取较大的空间。

特点:

占用空间少,查询速度快。

来源:

之所以起这个名字是因为布谷鸟生性贪婪,不自己筑巢,而是在别的鸟巢里面鸟蛋孵化,先成长的幼鸟会将别的鸟蛋挤出,这样独享“母爱”,类似于哈希冲突处理过程。

算法描述:

使用hashA、hashB计算对应的key位置:

1、两个位置均为空,则任选一个插入;

2、两个位置中一个为空,则插入到空的那个位置

3、两个位置均不为空,则踢出一个位置后插入,被踢出的对调用该算法,再执行该算法找其另一个位置,循环直到插入成功。

4、如果被踢出的次数达到一定的阈值,则认为hash表已满,并进行重新哈希rehash

实现过程:

我们知道实现布谷鸟散列是需要一个散列函数的集合。因此,我们要定义一个接口来获取到这样的一个集合。

public interface HashFamily {

//根据which来选择散列函数,并返回hash值

int hash(AnyType x, int which);

//返回集合中散列函数的个数

int getNumberOfFunctions();

//获取到新的散列函数

void generateNewFunctions();

}

定义变量:

//定义最大装填因子为0.4

private static final double MAX_LOAD = 0.4;

//定义rehash次数达到一定时,进行

private static final int ALLOWED_REHASHES = 1;

//定义默认表的大小

private static final int DEFAULT_TABLE_SIZE = 101;

//定义散列函数集合

private final HashFamily super AnyType> hashFunctions;

//定义散列函数个数

private final int numHashFunctions;

//定义当前表

private AnyType[] array;

//定义当前表的大小

private int currentSize;

//定义rehash的次数

private int rehashes = 0;

//定义一个随机数

private Random r = new Random();

初始化操作:

public CuckooHashTable(HashFamily super AnyType> hf){

this(hf, DEFAULT_TABLE_SIZE);

}

//初始化操作

public CuckooHashTable(HashFamily super AnyType> hf, int size){

allocateArray(nextPrime(size));

doClear();

hashFunctions = hf;

numHashFunctions = hf.getNumberOfFunctions();

}

public void makeEmpty(){

doClear();

}

//清空操作

private void doClear(){

currentSize = 0;

for (int i = 0; i < array.length; i ++){

array[i] = null;

}

}

//初始化表

private void allocateArray(int arraySize){

array = (AnyType[]) new Object[arraySize];

}

定义hash函数:

/**

*

* @param x 当前的元素

* @param which 选取的散列函数对应的位置

* @return

*/

private int myHash(AnyType x, int which){

//调用散列函数集合中的hash方法获取到hash值

int hashVal = hashFunctions.hash(x, which);

//再做一定的处理

hashVal %= array.length;

if (hashVal < 0){

hashVal += array.length;

}

return hashVal;

}

查询元素是否存在:

/**

* 查询元素的位置,若找到元素,则返回其当前位置&#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值