美文网首页
哈希表(HashTable)

哈希表(HashTable)

作者: 老王子H | 来源:发表于2018-11-28 17:00 被阅读0次

1.整型哈希函数的设计
小范围正整数直接使用
小范围负整数整体进行偏移
大整数,通常做法是"模一个素数"

2.浮点型哈希函数的设计
转成整型进行处理

3.字符串哈希函数的设计
转成整型进行处理


image.png

简单变形优化


image.png
防止整型溢出优化
image.png
具体代码实现
image.png

复合类型哈希函数的设计
转成整型进行处理


image.png

哈希函数的设计原则


image.png

哈希冲突的处理
链地址法


image.png

开放地址法之线性探测


image.png

开放地址法之平方探测


image.png

开放地址法之二次哈希


image.png

哈希表的动态空间处理


image.png

实现哈希表的业务逻辑

import java.util.TreeMap;

public class HashTable<K, V> {

    private final int[] capacity
            = {53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593,
            49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917,
            25165843, 50331653, 100663319, 201326611, 402653189, 805306457, 1610612741};
    private static final int upperTol = 10;
    private static final int lowerTol = 2;
    private int capacityIndex = 0;
    private TreeMap<K, V>[] hashTable;
    private int M;
    private int size;

    public HashTable() {

        this.M = capacity[capacityIndex];
        this.size = 0;
        hashTable = new TreeMap[M];
        for (int i = 0; i < M; i++) {
            hashTable[i] = new TreeMap<>();
        }
    }

    private int hash(K key) {
        return key.hashCode() & 0x7fffffff % M;
    }

    public void add(K key, V value) {

        TreeMap<K, V> map = hashTable[hash(key)];

        if (map.containsKey(key)) {
            map.put(key, value);
        } else {
            map.put(key, value);
            size++;
            if (size >= upperTol * M && capacityIndex + 1 < capacity.length) {
                capacityIndex++;
                resize(capacity[capacityIndex]);
            }
        }
    }

    public V remove(K key) {

        TreeMap<K, V> map = hashTable[hash(key)];

        V ret = null;
        if (map.containsKey(key)) {
            ret = map.remove(key);
            size--;
            if (size < lowerTol * M && capacityIndex - 1 >= 0) {
                capacityIndex--;
                resize(capacity[capacityIndex]);
            }
        }
        return ret;
    }

    public void set(K key, V value) {

        TreeMap<K, V> map = hashTable[hash(key)];

        if (!map.containsKey(key)) {
            throw new IllegalArgumentException(key + "doesn't exist.");
        } else {
            map.put(key, value);
        }
    }

    public boolean contains(K key) {

        return hashTable[hash(key)].containsKey(key);
    }

    public V get(K key) {

        return hashTable[hash(key)].get(key);
    }

    private void resize(int newM) {

        TreeMap<K, V>[] newHashTable = new TreeMap[newM];
        for (int i = 0; i < newM; i++) {
            newHashTable[i] = new TreeMap<>();
        }

        int oldM = M;
        M = newM;
        for (int i = 0; i < oldM; i++) {
            TreeMap<K, V> map = hashTable[i];
            for (K key : map.keySet()) {
                newHashTable[hash(key)].put(key, map.get(key));
            }
        }

        this.hashTable = newHashTable;
    }

}

相关文章

  • C#中HashTable用法和Dictionary比较

    一、哈希表(Hashtable)用法 哈希表(HashTable)简述Hashtable是System.Colle...

  • C#之数据结构(下)

    哈希表: Hashtable. (也叫散列表)无序. 哈希表(Hashtable) HashSet. 由一对(ke...

  • 哈希表和链表

    优秀文章:Chapter: 散列表(哈希表) 一、哈希表 哈希表hashtable(key,value) 就是把K...

  • 哈希表

    映射(Map) 和 集合(Set) 哈希表(HashTable)、哈希函数(Hash Function)、哈希碰撞...

  • 2019 算法面试相关(leetcode)--哈希表

    哈希表相关的原理可以参考下:浅谈哈希表(HashTable)深入理解哈希表哈希表的理解理解HashSet及使用 哈...

  • 哈希表(Hashtable)

    请看下回分解

  • 哈希表(HashTable)

    1.整型哈希函数的设计小范围正整数直接使用小范围负整数整体进行偏移大整数,通常做法是"模一个素数" 2.浮点型哈希...

  • 哈希表 - HashTable

    基本概念 哈希表是一种特殊的数据结构,通过索引,能快速的查找到某个元素。 设计原理 通过哈希函数,将key映射到v...

  • 3.11

    1.HashMap和HashTable区别HashMap基于哈希表的Map实现,HashTable基于Dicito...

  • C# HashTable和Dictionary的区别

    1.HashTable 哈希表(HashTable)表示键/值对的集合。在.NET Framework中,Hash...

网友评论

      本文标题:哈希表(HashTable)

      本文链接:https://www.haomeiwen.com/subject/cldzqqtx.html