📅  最后修改于: 2023-12-03 15:36:57.806000             🧑  作者: Mango
哈希表是一种数据结构,它将键映射到值。哈希表使用哈希函数来计算键的索引,然后在该索引处存储值。这使得哈希表可以快速查找和插入数据,具有常数时间的平均复杂度。
# 示例代码(Python)
hash_table = {}
hash_table['key1'] = 'value1'
hash_table['key2'] = 'value2'
print(hash_table)
哈希表的时间复杂度取决于哈希函数的效率以及哈希表的装载因子(Load Factor),通常情况下,哈希表的平均查找时间复杂度为 O(1)。
哈希冲突是指不同的键对应了相同的索引位置,这种情况下需要使用某种冲突解决方法避免数据的丢失或错误。
常见的哈希冲突解决方法包括链地址法(Chaining)、线性探测法(Linear Probing)和双重哈希法(Double Hashing)等。
# 链地址法(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
hash_table[hash_index].append((key, value))
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(2, 'value2')
print(hash_table.hash_table)
# 线性探测法(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [None]*self.size
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
while self.hash_table[hash_index] is not None:
hash_index = (hash_index + 1) % self.size
self.hash_table[hash_index] = (key, value)
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
print(hash_table.hash_table)
哈希函数是一种将键转换为索引的函数,它可以是任何计算机可执行的函数,通常会选择具有均匀分布特性的函数,以避免哈希冲突的发生。
常见的哈希函数包括:直接取模法、乘法哈希、平方取中法、一次多项式哈希、BKDR哈希和MurmurHash等。
# 直接取模法(Python示例代码)
def hash_function(key, size):
return key % size
hash_index = hash_function(12345, 100)
print(hash_index)
# MurmurHash(Python示例代码,需要使用第三方库mmh3)
import mmh3
hash_index = mmh3.hash('hello', 42)
print(hash_index)
哈希表的装载因子是指哈希表中已存储数据项数量除以哈希表的大小,通常情况下,当装载因子超过 0.7 时,需要进行扩容,以避免哈希冲突的发生。
# 哈希表扩容(Python示例代码)
class HashTable:
def __init__(self, capacity=10):
self.capacity = capacity
self.size = 0
self.hash_table = [None]*self.capacity
def hash_function(self, key):
return key % self.capacity
def insert(self, key, value):
if self.size >= self.capacity * 0.7:
self.resize()
hash_index = self.hash_function(key)
while self.hash_table[hash_index] is not None:
hash_index = (hash_index + 1) % self.capacity
self.hash_table[hash_index] = (key, value)
self.size += 1
def resize(self):
self.capacity *= 2
new_hash_table = [None]*self.capacity
for i in range(self.size):
if self.hash_table[i] is not None:
(key, value) = self.hash_table[i]
hash_index = self.hash_function(key)
while new_hash_table[hash_index] is not None:
hash_index = (hash_index + 1) % self.capacity
new_hash_table[hash_index] = (key, value)
self.hash_table = new_hash_table
hash_table = HashTable(10)
for i in range(20):
hash_table.insert(i, 'value'+str(i))
print(hash_table.capacity, hash_table.size)
通常情况下,哈希表中的数据项不能直接删除,因为删除操作可能会影响到哈希表中其他数据项的索引位置。因此,哈希表中删除数据项的通常做法是将其标记为已删除,然后在后续的操作中将其真正删除。
# 哈希表删除标记(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
self.hash_table[hash_index].append((key, value))
def delete(self, key):
hash_index = self.hash_function(key)
for i in self.hash_table[hash_index]:
if i[0] == key:
self.hash_table[hash_index].remove(i)
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
hash_table.delete(1)
print(hash_table.hash_table)
哈希表的迭代操作通常是遍历哈希表中的所有数据项,并对每个数据项执行相应的操作,比如统计数据项的数量、计算数据项的平均值等。
# 哈希表迭代操作(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
self.hash_table[hash_index].append((key, value))
def __iter__(self):
self.current = 0
self.items = []
for i in range(self.size):
if self.hash_table[i]:
for item in self.hash_table[i]:
self.items.append(item)
return self
def __next__(self):
if self.current >= len(self.items):
raise StopIteration
value = self.items[self.current]
self.current += 1
return value
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
for item in hash_table:
print(item)
哈希集合是一种基于哈希表实现的集合数据结构,它存储一组唯一的元素,具有快速查找元素是否在集合中的特点。
# 哈希集合操作(Python示例代码)
hash_set = set()
hash_set.add(1)
hash_set.add(2)
hash_set.add(3)
hash_set.add(4)
print(hash_set)
哈希映射是一种基于哈希表实现的键值对数据结构,类似于 Python 中的字典。哈希映射可以快速查找和插入键值对,具有常数时间的平均复杂度。
# 哈希映射操作(Python示例代码)
hash_map = {}
hash_map['key1'] = 'value1'
hash_map['key2'] = 'value2'
hash_map['key3'] = 'value3'
print(hash_map)
在哈希表中查找键可以通过哈希函数计算出键的索引位置,然后在该索引位置处查找是否存在该键,如果存在则返回对应的值。
# 哈希表查找键(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
self.hash_table[hash_index].append((key, value))
def get(self, key):
hash_index = self.hash_function(key)
for i in self.hash_table[hash_index]:
if i[0] == key:
return i[1]
return None
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
print(hash_table.get(1))
在哈希表中插入键值对可以通过哈希函数计算出键的索引位置,然后在该索引位置处插入键值对。
# 哈希表插入键值对(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
self.hash_table[hash_index].append((key, value))
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
print(hash_table.hash_table)
在哈希表中更新键值对可以通过哈希函数计算出键的索引位置,然后在该索引位置处更新对应的值。
# 哈希表更新键值对(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
for i in self.hash_table[hash_index]:
if i[0] == key:
i[1] = value
return
self.hash_table[hash_index].append((key, value))
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
hash_table.insert(1, 'new_value')
print(hash_table.hash_table)
在哈希表中删除键值对可以通过哈希函数计算出键的索引位置,然后在该索引位置处查找对应的键值对并删除。
# 哈希表删除键值对(Python示例代码)
class HashTable:
def __init__(self):
self.size = 10
self.hash_table = [[] for _ in range(self.size)]
def hash_function(self, key):
return key % self.size
def insert(self, key, value):
hash_index = self.hash_function(key)
for i in self.hash_table[hash_index]:
if i[0] == key:
i[1] = value
return
self.hash_table[hash_index].append((key, value))
def delete(self, key):
hash_index = self.hash_function(key)
for i in self.hash_table[hash_index]:
if i[0] == key:
self.hash_table[hash_index].remove(i)
hash_table = HashTable()
hash_table.insert(1, 'value1')
hash_table.insert(11, 'value11')
hash_table.delete(1)
print(hash_table.hash_table)
避免哈希冲突的方法通常是选择哈希函数和扩容哈希表,在哈希函数的设计中尽可能让输出结果均匀分布,扩容哈希表则可以增加哈希表的大小以降低装载因子。此外,还可以使哈希表每个节点存放多个值,形成链表。
哈希表的并发操作可以采用多种方法,包括:加锁机制、分离锁机制、读写锁机制等。其中,读操作可以使用读锁进行并发控制,写操作需要使用写锁进行互斥。
哈希表的优点是快速查找、插入和删除,具有常数时间的平均复杂度,适合处理大量数据。其缺点是哈希冲突和空间占用问题,需要额外的操作或扩容来解决。
哈希表的应用场景包括:字典、唯一性判断、缓存系统、数据库索引、路由表等。哈希表的高效查找和插入操作对于大量数据的处理十分有利。