zoukankan      html  css  js  c++  java
  • 哈希表的设计

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

    哈希函数的设计:

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

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

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

    原则:

    1.一致性:如果a == b,则hash(a) == hash(b)

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

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

    2:JAVA中的hashCode方法:

    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之后,数据量小的时候,还是链表,当哈希冲突达到一定的程度每个位置从链表转成红黑树。

  • 相关阅读:
    textarea输入限制
    MyBatis 下使用SQLite
    天气预报
    导出Excel、csv
    WDK 常用的几个函数
    Windows 内核 hello world
    内核模式下的文件操作
    Windows 内核编程初涉
    Windows 内地管理
    Windows 内核 同步处理
  • 原文地址:https://www.cnblogs.com/airycode/p/10249709.html
Copyright © 2011-2022 走看看