详解哈希查找算法原理与使用方法

哈希查找算法

哈希查找算法,是一种利用”哈希”概念来快速查找数据的算法,其核心思想是通过将数据中的key值映射到哈希表中的某个位置,从而快速的找到对应的value值。

一、哈希表基本原理

哈希表是一种以键值对(key-value)来存储和查找数据的数据结构,它的存储方式是通过利用一个哈希函数将键(key)映射到哈希表(散列表)的位置上。哈希表由一个数组和一个哈希函数组成,计算键的哈希值并将其映射到数组的索引上。

下面是一个简单的示例,展示了哈希表是如何工作的:

# 创建一个哈希表
hash_table = [None] * 5   # 初始化一个长度为5的哈希表

# 哈希函数
def hash_func(key):
    return key % len(hash_table)   # 取余数作为索引

# 插入数据
def insert_hash_table(key, value):
    hash_key = hash_func(key)
    hash_table[hash_key] = value

insert_hash_table(10, "hello")
insert_hash_table(11, "world")

在上面的示例中,我们首先创建了一个长度为5的哈希表,接着定义了一个哈希函数hash_func,此哈希函数的作用是将key值与表长取余数,计算出该key值所对应的索引位置。

我们用insert_hash_table函数将key值为10和11的value分别插入哈希表中,通过hash_func函数计算哈希值并获得对应的索引,最终得到以下哈希表:

[None, None, "hello", "world", None]

这里,key值为10的value存储在哈希表的索引2处,key值为11的value存储在哈希表的索引3处。我们通过哈希函数,将key值映射到数组索引上,从而实现了快速存储和查找value值。

二、哈希查找算法的原理

哈希查找算法,就是通过哈希表来实现数据的快速查找。首先,我们需要将数据中的key值通过哈希函数计算出来,然后将其映射到哈希表中的某个位置,最终得到key所对应的value值。

在哈希查找算法中,我们需要注意两个问题:

  • 哈希表的长度要尽量大,这样才能让每个key值都能够均匀分布。
  • 不同的key值可能会映射到同一个位置上,这种情况称为”哈希冲突”,要想解决这个问题,我们可以使用链表散列,将所有哈希到同一位置的key值都存储在同一个链表中。

下面是一个简单的哈希查找算法示例:

# 定义哈希表
hash_table = [None] * 5

# 哈希函数
def hash_func(key):
    return key % len(hash_table)

# 插入数据
def insert_hash_table(key, value):
    hash_key = hash_func(key)
    if hash_table[hash_key] is None:
        hash_table[hash_key] = []
    hash_table[hash_key].append(value)

# 哈希查找
def search_hash_table(key):
    hash_key = hash_func(key)
    if hash_table[hash_key] is not None:
        for value in hash_table[hash_key]:
            if value[0] == key:
                return value[1]
    return None

insert_hash_table(10, ["name", "John"])
insert_hash_table(11, ["age", 18])
value = search_hash_table(10)
print(value)  # 输出["name", "John"]

在上面的示例中,我们定义了一个长度为5的哈希表hash_table,接着定义了哈希函数hash_func,此哈希函数和前面介绍的一样,用于根据key值计算哈希值,最后得到对应的索引位置。

我们用insert_hash_table函数将数据插入到哈希表中,如果当前哈希表中的该索引处还没有数据,就先创建一个空列表,接着将数据加入到该列表中。

最后,我们通过search_hash_table函数来查找数据,这个函数首先再次通过哈希函数计算出哈希值,接着判断该索引处是否有数据,如果有,就遍历该索引处所有的数据,找到对应的key值,最终得到key所对应的值。在上面的示例中,我们找到了key为10的value值,即[“name”, “John”]

三、哈希查找算法的适用场景

哈希查找算法在时间和空间上都具有非常突出的优势,在以下多个场景中被广泛应用:

  • 网络路由器/交换机:用于快速查找数据包所对应的端口号。
  • 缓存系统:用于快速查找缓存中是否存储了指定的数据。
  • 数据库索引:利用哈希查找算法,快速查找对应的数据。
  • 拼写检查器:对于一个拼写错误的单词,可以通过哈希表来快速检查它是否是正确的单词。
  • … …

四、实战示例

示例一:

有一组整数数据,我们要在其中查找特定整数的位置,可使用哈希查找算法,具体代码如下:

# 哈希表初始化
hash_table = [None] * 11

# 哈希函数
def hash_func(key):
    return key % len(hash_table)

# 插入数据
def insert_hash_table(key):
    hash_key = hash_func(key)
    if hash_table[hash_key] is None:
        hash_table[hash_key] = []
    hash_table[hash_key].append(key)

# 哈希查找
def search_hash_table(key):
    hash_key = hash_func(key)
    if hash_table[hash_key] is not None:
        for index, value in enumerate(hash_table[hash_key]):
            if value == key:
                return index, hash_key
    return None, None

# 插入数据
data = [12, 18, 68, 23, 78, 43, 11, 29]
for item in data:
    insert_hash_table(item)

# 使用哈希查找算法查找68
index, key = search_hash_table(68)
print("68所在的索引位置为:", index, ",位于哈希表的", key, "位置上")

在上面的示例中,我们定义了一组整数数据,接着使用哈希表将它们存储起来,最后使用哈希查找算法查找特定整数68的位置。

示例二:

有很多学生和他们的成绩,我们要通过学生姓名快速查找他们的成绩,可以使用哈希查找算法,具体代码如下:

# 初始化哈希表
hash_table = [None] * 11

# 哈希函数
def hash_func(key):
    return sum([ord(c) for c in key]) % len(hash_table)

# 插入数据
def insert_hash_table(key, value):
    hash_key = hash_func(key)
    if hash_table[hash_key] is None:
        hash_table[hash_key] = []
    hash_table[hash_key].append((key, value))

# 哈希查找
def search_hash_table(key):
    hash_key = hash_func(key)
    if hash_table[hash_key] is not None:
        for item in hash_table[hash_key]:
            if item[0] == key:
                return item[1]
    return None

# 插入数据
students = {"John": 90, "Alice": 85, "Bob": 93, "Dan": 78}
for name, score in students.items():
    insert_hash_table(name, score)

# 使用哈希查找算法查找John的成绩
score = search_hash_table("John")
print("John的成绩为:", score)

在上面的示例中,我们给每个学生的名字分配一个哈希值,并将学生的名字和成绩存储到哈希表中,最后使用哈希查找算法查找特定的学生姓名并得到对应的成绩。

总结

哈希查找,是一种利用哈希表实现数据快速查找的算法,在时间和空间上都具有非常突出的优势。通过哈希查找算法,我们能够从大量的数据中快速地查找出指定的数据。无论是在实际开发中还是在面试中,作为一个程序员,我们都需要掌握哈希查找算法,以便能够更好的解决实际问题。