哈希表 07 扩容后M不再是素数的解决办法

本文详细介绍了一种基于素数表的HashTable数据结构实现方法,包括容量调整、扩容与缩容策略,以及如何通过容量索引进行高效的空间管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

素数表

  • 该素数表维护在数据结构HashTable中;
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 int capacityIndex = 0;

构造方法

  • 初始容量由容量指针指定;
public HashTable(){
    this.M = capacity[capacityIndex];
    size = 0;
    hashtable = new TreeMap[M];
    for(int i = 0 ; i < M ; i ++)
        hashtable[i] = new TreeMap<>();
}

扩容代码的响应改变

  • 容量指针在右移的时候是有边界的;
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){
    V ret = null;
    TreeMap<K, V> map = hashtable[hash(key)];
    if(map.containsKey(key)){
        ret = map.remove(key);
        size --;

        if(size < lowerTol * M && capacityIndex - 1 >= 0){
            capacityIndex --;
            resize(capacity[capacityIndex]);
        }
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值