哈希表的设计

  • 哈希表充分体现了算法设计领域的经典思想:空间换区时间
  • 哈希表是时间和空间之间的一个平衡
  • 哈希函数的设计很重要
  • 键经过哈希函数获得索引分布均匀

哈希函数的设计:java

1.键经过哈希函数获得索引分布均匀:特殊领域的哈希函数设计方式甚至有专门的论文这个不考虑,咱们只是设计最普通的函数设计:算法

  • 整型:小范围的正整数直接使用,小范围的负整数进行偏移好比:-100-100能够偏移成0-200
  • 大整数:身份证号:一般作法就是取模,好比,取出来后四位,等同于mod 10000,这种方式设计的哈希函数分布不均匀,还容易冲突,一个简单的方法就是:mod一个素数
  • 浮点型:在计算机中都是32位或者64位的二进制的标识,只不过计算机解析成了浮点型,转成整型数字处理,仍是用取模的方式
  • 字符串:转成大的整型数字来处理。

哈希函数总结:上述设计方式都是转化成整型处理,并非惟一的方法,ide

原则:函数

1.一致性:若是a == b,则hash(a) == hash(b)this

2.高效性:计算高效简便设计

3.均匀性:哈希值均匀分布code

2:JAVA中的hashCode方法:blog

package hash;

/**
 * Created by admin on 2019/1/10.
 */
public class HashCode {

    public static void main(String[] args) {
        Integer a = 42;
        System.out.println(a.hashCode());
        Integer b = -42;
        System.out.println(b.hashCode());
        Double c = 3.141592653;
        System.out.println(c.hashCode());
        String d = "airycode";
        System.out.println(d.hashCode());

        Student s = new Student(3,2,"bobo","bobo");
        System.out.println(s.hashCode());

        Student s2 = new Student(3,2,"BoBo","BoBo");
        System.out.println(s2.hashCode());
    }

}


package hash;

/**
 * Created by admin on 2019/1/10.
 */
public class Student {

    int grade;
    int cls;
    String firstName;
    String lastName;

    public Student(int grade, int cls, String firstName, String lastName) {
        this.grade = grade;
        this.cls = cls;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public int hashCode() {
        int B = 31;
        int hash = 0;
        hash = hash*B+grade;
        hash = hash*B+cls;
        hash = hash*B+firstName.toLowerCase().hashCode();//BB 和bb是一我的
        hash = hash*B+lastName.toLowerCase().hashCode();
        return hash;
    }
}

  3:哈希函数冲突的处理:链地址法索引

java8以前,哈希表的实现,每一个位置上对应的是一个链表。java8以后,数据量小的时候,仍是链表,当哈希冲突达到必定的程度每一个位置从链表转成红黑树。字符串

相关文章
相关标签/搜索