二十四、hash表之开放地址法

why:上一节虽然使用了biginteger解决了数据的越界问题,但是还会存在一个问题,就是压缩之后带来的冲突问题。所以本次使用开放地址法解决这个问题。

what:开放地址法就是如果地址冲突那么从数组中找一个空的位置存放该数据。

源代码:

public class hashTable {
private Info[] array;

public hashTable() {
// TODO Auto-generated constructor stub
array = new Info[100];
}
public hashTable(int MaxSize)
{
array = new Info[MaxSize];
}

//插入数据
public void insert(Info info)
{
int hashVal = hashCode1(info.getKey()); //获得索引并且hash化
while(array[hashVal] != null && array[hashVal].getName()!=null) //找到插入的位置
{
hashVal++;
hashVal = hashVal % array.length; //防止越界
}
array[hashVal] = info;

}

//查看数据
public Info find(String key)
{
int hashVal = hashCode1(key); //key的hash化
while(array[hashVal]!=null)
{
if(array[hashVal].getKey() == key)
{
return array[hashVal];
}
hashVal++;
hashVal %= array.length;
}

return null;
}

//删除数据
public Info deleInfo(String key)
{
int hashVal = hashCode1(key);
while(array[hashVal]!=null)
{
if(array[hashVal].getKey() ==key)
{
Info tmp = array[hashVal];
tmp.setName(null);
return tmp;
}
hashVal++;
hashVal %= array.length;
}
return null;

}

//hash编码
public int hashCode1(String key)
{
// int hashKey =0;
// int letter;
// int pow27 = 1;

BigInteger hashKey = new BigInteger("0");
BigInteger pow27 = new BigInteger("1");

/*********相加编码法******************/
// for(int i=key.length()-1;i>=0;i--)
// {
// letter = key.charAt(i);
// hashKey += letter;
// }
/**********相加编码法*****************/


/**************相乘编码法********************/
for(int i=key.length()-1;i>=0;i--)
{
int letter = key.charAt(i)-96 ;
BigInteger letterB = new BigInteger(String.valueOf(letter));
hashKey = hashKey.add(letterB.multiply(pow27));
pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));
}
/**************相乘编码法********************/

return hashKey.mod(new BigInteger(String.valueOf(array.length))).intValue();

}
}

posted @ 2018-03-09 10:24  爱编程的文科生  阅读(379)  评论(0编辑  收藏  举报