• 二十四、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();

    }
    }

  • 相关阅读:
    十六进制转十进制
    十进制转十六进制
    历届试题 高僧斗法
    历届试题 错误票据
    历届试题 大臣的旅费
    历届试题 九宫重排/八数码问题
    Skip the Class
    历届试题 剪格子
    leetcode 337. House Robber III
    猿辅导 2019年 校招提前批笔试
  • 原文地址:https://www.cnblogs.com/fyz666/p/8532442.html
Copyright © 2020-2023  润新知