美文网首页
数据结构--哈希表

数据结构--哈希表

作者: Hayley__ | 来源:发表于2021-04-26 13:19 被阅读0次

    原则:

    • 一致性:如果a==b,则hash(a) == hash(b)
    • 高效性:计算高效简便
    • 均匀性:哈希值均匀分布
    • 哈希函数:键转化成索引(空间换时间)
    设计 冲突处理

    代码示例

    import java.util.TreeMap;
    //哈希表
    public class HashTable <K, V>{
    
        private static final int upperTol = 10;
        private static final int lowerTol = 2;
    
        private final int[] capacity = {53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593,
                49157, 98317, 196613, 393142, 786433, 1572869, 3145739, 6291469, 12582917, 25165843,
                50331653, 100663319, 201326611, 402653189, 805306457, 1610612741}; //1610612741 几乎int 型可承载的极限
    
        private int capacityIndex = 0;
    
        private TreeMap<K, V>[] hashtable;
        private int M;
        private int size;
    
        public HashTable(int M) {
            this.M = M;
            size = 0;
            hashtable = new TreeMap[M];
            for (int i = 0; i < M; i++) {
                hashtable[i]= new TreeMap<>();
            }
        }
    
        private int hash(K key) {
            //0x7fffffff 表示去除符号(可能为负数)
            return (key.hashCode() & 0x7fffffff) % M;
        }
    
        public int getSize() {
            return size;
        }
    
        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;
        }
    
        //动态扩容
        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;
            this.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;
        }
    
    
        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!");
            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);
        }
    
    }
    
    时间复杂度 动态扩容 复杂度分析

    相关文章

      网友评论

          本文标题:数据结构--哈希表

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