哈希表的設計

  • 哈希表充分體現了算法設計領域的經典思想:空間換區時間
  • 哈希表是時間和空間之間的一個平衡
  • 哈希函數的設計很重要
  • 鍵經過哈希函數獲得索引分佈均勻

哈希函數的設計: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以後,數據量小的時候,仍是鏈表,當哈希衝突達到必定的程度每一個位置從鏈表轉成紅黑樹。字符串

相關文章
相關標籤/搜索