数据结构和算法:哈希表

哈希表(Hash Table)是一种非常重要的数据结构,它利用哈希函数将键(Key)映射到存储桶(Bucket)的位置,从而实现快速的插入、查找和删除操作。在Java中,哈希表通常由HashMap类实现。

以下是一个简单的哈希表实现,仅用于教学目的,不建议在生产环境中使用。

首先,定义一个哈希函数,它可以根据键计算哈希值:

java 复制代码
public class HashTable {
    private static final int DEFAULT_CAPACITY = 16;
    private int capacity;
    private List<LinkedList<KeyValuePair>> buckets;

    // 简单的哈希函数
    private int hash(int key) {
        return key % capacity;
    }

    // 键值对类
    private static class KeyValuePair {
        int key;
        Object value;

        KeyValuePair(int key, Object value) {
            this.key = key;
            this.value = value;
        }
    }

    public HashTable() {
        this(DEFAULT_CAPACITY);
    }

    public HashTable(int capacity) {
        this.capacity = capacity;
        buckets = new ArrayList<>(capacity);
        for (int i = 0; i < capacity; i++) {
            buckets.add(new LinkedList<>());
        }
    }
}

然后,我们可以实现插入、查找和删除操作:

java 复制代码
public class HashTable {
    // ... 省略之前的代码 ...

    // 插入键值对
    public void put(int key, Object value) {
        int index = hash(key);
        LinkedList<KeyValuePair> bucket = buckets.get(index);
        for (KeyValuePair pair : bucket) {
            if (pair.key == key) {
                pair.value = value; // 更新值
                return;
            }
        }
        bucket.add(new KeyValuePair(key, value)); // 插入新的键值对
    }

    // 获取键对应的值
    public Object get(int key) {
        int index = hash(key);
        LinkedList<KeyValuePair> bucket = buckets.get(index);
        for (KeyValuePair pair : bucket) {
            if (pair.key == key) {
                return pair.value;
            }
        }
        return null; // 未找到键
    }

    // 删除键值对
    public void remove(int key) {
        int index = hash(key);
        LinkedList<KeyValuePair> bucket = buckets.get(index);
        Iterator<KeyValuePair> iterator = bucket.iterator();
        while (iterator.hasNext()) {
            KeyValuePair pair = iterator.next();
            if (pair.key == key) {
                iterator.remove(); // 删除键值对
                return;
            }
        }
    }
}

注意:

  1. 这个实现使用了简单的取模运算作为哈希函数,但在实际中,哈希函数的设计要复杂得多,需要考虑哈希冲突的解决、哈希分布的均匀性等问题。
  2. 当哈希表中的元素过多时,可能会导致哈希冲突加剧,影响性能。此时,可以通过重新分配更大的空间并重新哈希所有元素来解决这个问题,这通常被称为"扩容"或"再哈希"。
  3. Java中的HashMap类使用了更复杂的数据结构和算法,包括链表和红黑树来解决哈希冲突和保持性能。这个简单的哈希表实现仅用于教学目的,无法与HashMap的性能和功能相比。
相关推荐
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E6 小时前
【二分法】寻找峰值
算法
mit6.8246 小时前
位运算|拆分贪心
算法
ghie90906 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体16 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk9986 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
Z1Jxxx7 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++7 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
vyuvyucd7 小时前
C++引用:高效编程的别名利器
算法
鱼跃鹰飞8 小时前
Leetcode1891:割绳子
数据结构·算法