码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构--解决散列冲突,平方探测法

时间:2015-03-19 22:04:18      阅读:4747      评论:0      收藏:0      [点我收藏+]

标签:数据结构   散列冲突平方探测法   

上代码:

package com.itany.quadraticprobing;

import java.util.LinkedList;
import java.util.List;

//使用平方探测的散列表 来解决散列时的冲突问题
public class QuadraticProbingHashTable<T>
{
    private static final int  DEFAULT_TABLE_SIZE=11;
    private HashEntry<T>[] array;
    private int currentSize;//the number of occupied cells
    //这个类用来装数据  还有一些标记 来标记是否active 也就是被删除(不是真被删除)所以需要一个类来进行封装
    private static class HashEntry<T>
    {
        private T element;//the element
        private boolean isActive;//false if marked deleted
        public HashEntry(T element)
        {
            this(element,true);
        }
        public HashEntry(T element,boolean i)
        {
            this.element=element;
            isActive=i;
        }
    }
    public QuadraticProbingHashTable()
    {
        this(DEFAULT_TABLE_SIZE);
    }
    public QuadraticProbingHashTable(int size)
    {
        allocateArray(size);
        makeEmpty();
    }
    public void makeEmpty()
    {
        currentSize=0;
        for(int i=0;i<array.length;i++)
        {
            array[i]=null;
        }
    }
    //判断是否存在 必须先找到该元素位置  然后再通过位置判断是否懒惰删除了(标记为删除)
    public boolean contains(T t)
    {
        int curPosition=findPos(t);
        return isActive(curPosition);
    }
    public void insert(T t)
    {
        int curPosition=findPos(t);
        if(isActive(curPosition))
                return;
        array[curPosition]=new HashEntry<T>(t);
        if(++currentSize>array.length/2)//探测法要保证空的位置>=一半空间
            reHash();
    }
    public void remove(T t)
    {
        int curPosition=findPos(t);
        if(array[curPosition].isActive)
            array[curPosition].isActive=false;//改变属性
    }
    private void reHash()
    {
        HashEntry<T>[] oldArray=array;//复制一下一会要用    theLists在重新new一个
        array=new HashEntry[nextPrime(2*array.length)];
        currentSize=0;
        //把原来的元素复制到新的数组中  注意是把集合中的元素复制进去
        for(int i=0;i<oldArray.length;i++)
        {
            if(oldArray[i]!=null && oldArray[i].isActive)
                insert(oldArray[i].element);
        }
        
    }
    private int findPos(T t)
    {
        int offset=1;
        int curPosition=myHash(t);
        //如果该位置里面有值 并且是这个hash没出现过的 那么就要继续寻找其他位置  如果出现了重复的 直接返回
        while(array[curPosition]!=null && !array[curPosition].element.equals(t))
        {
            //这是进行平方探测的快速方法 f(i)=f(i-1)+2i-1
            curPosition+=offset;
            offset+=2;
            if(curPosition>array.length)
                curPosition-=array.length;
        }
        return curPosition;
    }
    private static boolean isPrime(int num)
    {
        int i=1;
        while((num%(i+1))!=0)
        {
            i++;
        }
        if(i==num-1)
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
    private static int nextPrime(int num)
    {
        while(!isPrime(num))
        {
            num++;
        }
        return num;
    }
    private int myHash(T t)
    {
        int hashValue=t.hashCode();
        hashValue%=array.length;
        return hashValue;
    }
    //把判断是否被删除合成一个方法 在做contains判断时会用到
    private boolean isActive(int curPosition)
    {
        return array[curPosition]!=null && array[curPosition].isActive;
    }
    private void allocateArray(int arraySize)
    {
        array=new HashEntry[arraySize];
    }
    
}

package com.itany.quadraticprobing;

public class Test
{
    
    public static void main(String[] args)
    {
        QuadraticProbingHashTable<Integer> sc=new QuadraticProbingHashTable<Integer>();
        System.out.println(sc.contains(10));
        sc.insert(10);
        System.out.println(sc.contains(10));
        sc.remove(10);
        System.out.println(sc.contains(10));
    }
    
}
结果:

false
true
false


数据结构--解决散列冲突,平方探测法

标签:数据结构   散列冲突平方探测法   

原文地址:http://blog.csdn.net/u012411414/article/details/44464601

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!