zoukankan      html  css  js  c++  java
  • 二十四、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();

    }
    }

  • 相关阅读:
    javascript阻止子元素继承父元素事件
    UTC 时间转化为北京时间
    uniapp中引入less文件
    HDU 1002 A + B Problem II(大数据)
    FatMouse's Speed(dp)
    Monkey and Banana(dp)
    Piggy-Bank(dp,背包)
    Longest Ordered Subsequence(最长上升子序列,dp)
    我的第一篇博客
    redis优化方案
  • 原文地址:https://www.cnblogs.com/fyz666/p/8532442.html
Copyright © 2011-2022 走看看