首先你要知道什么二次探测,在哈希法都是用来解决哈希冲突的。
然后,二次探测就是在线性探测上做一个修改而成的,线性探测中,遇到冲突就自增1,而二次探测中,就是把这个自增1 , 去掉换成一个固定值或自定义值,比如,遇到冲突就自增5啊,或者自增时自己用算法计算的步长。
比较简单所以没有代码!
在哈希法,就是有两个哈希方法,第一个哈希化方法,确定初始位置,冲突就执行第二个哈希化方法。
注意:在哈希法第二个哈希化函数的要求
1.第二个哈希化函数不能和第一个一样
2.不能输出0
举个例子:第二个方法可以设计成这样
第二个哈希函数
计算下标值:指数-(存储值%指数)(指数:只能被1和其本身整除的数)
然后上代码:
package map;
/*
* 在哈希法
*
* 第二个哈希化函数的要求
*
1.第二个哈希化函数不能和第一个一样
2.不能输出0
第二个哈希函数
指数-存储值%指数(指数:只能被1和其本身整除的数)
*/
public class doubleHashApp
{
private Item [] arr ;//数组
private int size ;//当前数组中元素的个数
private Item newItem ;
public doubleHashApp ( int maxSize )
{
arr = new Item [ maxSize ] ;
size = 0 ;
}
//判断是否满
public boolean isFull ()
{
return size == arr.length ;
}
//哈希化
public int hash ( int value )
{
return value % arr.length ;
}
//二次哈希
public int doubleHash ( int value )
{
int index = 5 - ( value % 5 ) ;
//因为在哈希不能返回0,所以如果上面计算成0或负的,就直接付个值(值你随意),千万别不写!!!不然会出现莫名其妙的问题
if ( index <= 0 )
{
index = 2 ;
}
return index ;
}
//查找数据
public int find ( int data )
{
int index = hash ( data ) ;//存放第一次哈希化后下标
int step = doubleHash ( data ) ;//存放第二次哈希化后值
while ( arr [index] != null )
{
//如果找到就返回索引下标
if ( arr [index].getData () == data )
{
return index ;
}
index += step ;//没找到使用二次哈希
index %= arr.length ;//防止index超出数组下标
}
return - 1 ;//没找到
}
//插入数据
public void insert ( int data )
{
if ( isFull () )
{
System.out.println ( "full" );
return;
}
int index = hash ( data ) ;//存放第一次哈希化后下标
int step = doubleHash ( data ) ;//存放第二次哈希化后值
newItem = new Item ( data ) ;
//找位置
while ( arr [index] != null )
{
index += step ;
index %= arr.length ;
}
//跳出循环代表找到空位了
arr [index] = newItem ;
++size ;
}
//删除数据
public boolean delete ( int data )
{
//find方法的返回值为-1代表没找到
int value = find ( data ) ;
if ( value == - 1 )
{
return false ;
}
else
{
arr [value] = null ;
return true ;
}
}
//哈希无法有序遍历,这里的只是用来观察元素分布情况
public void display ()
{
for ( int i = 0 ; i < arr.length ; ++ i )
{
if ( arr [i] != null )
System.out.print ( arr [i].getData () + " " );
else
System.out.print ( "null " );
}
System.out.println ();
}
}