数据结构与算法之 leetcode 哈希表设计 自定义哈希函数

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


自定义哈希表设计与实现:LeetCode 哈希表设计问题解析

哈希表(Hash Table)是一种基于哈希函数将键映射到表中的位置的数据结构。它提供了平均时间复杂度为O(1)的查找、插入和删除操作,因此在计算机科学中有着广泛的应用。在LeetCode等编程竞赛平台中,哈希表设计是一个常见的面试题。本文将围绕LeetCode上的“哈希表设计”问题,探讨自定义哈希函数的设计与实现。

LeetCode 哈希表设计问题

问题描述:设计一个哈希表,实现以下功能:

- `put(key, value)`:向哈希表中插入一个键值对。如果键已存在,则更新其值。

- `get(key)`:返回哈希表中对应的值。如果键不存在,则返回-1。

- `remove(key)`:从哈希表中删除键对应的值。

自定义哈希函数

哈希函数是哈希表的核心,它决定了键值对的存储位置。一个好的哈希函数应该具有以下特性:

1. 均匀分布:将键均匀分布到哈希表的各个位置,减少冲突。

2. 简单高效:计算速度快,易于实现。

3. 无重复:对于不同的键,哈希值应该不同。

以下是一个简单的自定义哈希函数实现:

python

class SimpleHash:


def __init__(self, size=1000):


self.size = size

def hash(self, key):


return hash(key) % self.size


在这个例子中,我们使用了Python内置的`hash()`函数来生成哈希值,并通过取模操作来保证哈希值在预定义的哈希表大小范围内。

哈希表实现

接下来,我们将使用自定义的哈希函数来实现一个简单的哈希表:

python

class HashTable:


def __init__(self, size=1000):


self.size = size


self.table = [None] self.size

def put(self, key, value):


index = self.hash(key)


if self.table[index] is None:


self.table[index] = [(key, value)]


else:


for i, (k, v) in enumerate(self.table[index]):


if k == key:


self.table[index][i] = (key, value)


return


self.table[index].append((key, value))

def get(self, key):


index = self.hash(key)


if self.table[index] is None:


return -1


for k, v in self.table[index]:


if k == key:


return v


return -1

def remove(self, key):


index = self.hash(key)


if self.table[index] is None:


return


for i, (k, v) in enumerate(self.table[index]):


if k == key:


del self.table[index][i]


return


在这个实现中,我们使用了一个列表来存储每个位置上的键值对。当插入或删除操作发生时,我们首先计算键的哈希值,然后根据哈希值找到相应的位置。

冲突解决

在实际应用中,由于哈希函数的特性,冲突是不可避免的。解决冲突的方法有很多,以下是一些常见的方法:

1. 链地址法:将具有相同哈希值的键值对存储在同一个位置,形成一个链表。

2. 开放寻址法:当发生冲突时,在哈希表中寻找下一个空位置,将键值对插入其中。

以下是一个使用链地址法解决冲突的哈希表实现:

python

class HashTableWithChaining:


def __init__(self, size=1000):


self.size = size


self.table = [None] self.size

def hash(self, key):


return hash(key) % self.size

def put(self, key, value):


index = self.hash(key)


if self.table[index] is None:


self.table[index] = [(key, value)]


else:


for k, v in self.table[index]:


if k == key:


self.table[index][0] = (key, value)


return


self.table[index].append((key, value))

def get(self, key):


index = self.hash(key)


if self.table[index] is None:


return -1


for k, v in self.table[index]:


if k == key:


return v


return -1

def remove(self, key):


index = self.hash(key)


if self.table[index] is None:


return


for i, (k, v) in enumerate(self.table[index]):


if k == key:


del self.table[index][i]


return


在这个实现中,我们使用了一个列表来存储每个位置上的键值对链表。当插入或删除操作发生时,我们遍历链表来查找或更新键值对。

总结

本文介绍了LeetCode上的哈希表设计问题,并探讨了自定义哈希函数的设计与实现。我们实现了一个简单的哈希表,并使用链地址法来解决冲突。通过本文的学习,读者应该能够理解哈希表的基本原理,并能够根据实际需求设计合适的哈希函数和冲突解决策略。

在实际应用中,哈希表的设计和实现可能会更加复杂,需要考虑更多的因素,如哈希表的动态扩容、负载因子等。但本文所介绍的基本概念和实现方法为读者提供了良好的起点。