数据结构和算法:哈希表

哈希表(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的性能和功能相比。
相关推荐
shehuiyuelaiyuehao9 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民11 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾11 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP11 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin12 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_1013 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
纪念 22913 小时前
数据结构排序(三)
数据结构
船厂电气自动化ai大模型13 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳14 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66614 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法