python--数据结构--哈希查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现:

# search_hash_table.py
from collections import deque
import math


class Record:
    def __init__(self, key):
        self.key = key
        self.other_info = None


class HashTable:
    def __init__(self, table_len):
        self.table = deque([None for i in range(table_len)])
        self.table_len = table_len


flag = False  # flag为True时表明hash_func已调用过一次max_prime,防止多次对max_prime的调用
p = 0  # 存储小于等于一个数的最大素数,也是max_prime的计算结果


def max_prime(number):
    """
    获取小于等于一个数的最大素数
    :param number:
    :return:
    """
    j = 0
    for i in range(number-1, 1, -1):
        a = int(math.sqrt(i))+1
        for j in range(2, a):
            if i % j == 0:
                break
        if i % j != 0:
            global flag
            flag = True
            return i


def hash_func(table_len, key) -> int:
    """
    除留取余法

    :param table_len:
    :param key:
    :return:
    """
    if not flag:
        global p
        p = max_prime(table_len)
    index = key % p
    return index  # 返回关键字在哈希表中的对应位置


def hash_search(hash_table: HashTable, key):
    """
    查找关键字在哈希表中的下标

    哈希表的查找过程与哈希表的创建过程是一致的。

    算法思想:
        (1) 首先计算h0=hash_func(table_len, key)
        (2) 如果单元h0为空,则所查元素不存在
        (3) 如果单元h0中元素的关键字key,则查找到所查元素
        (4) 否则重复下下述解决冲突的过程。
            a. 按解决冲突的方法,找出下一个哈希地址hi
            b. 如果单元hi为空,则所查元素不存在
            c. 如果单元hi中元素的关键字key,则查找到所查元素

    :param hash_table:
    :param key:
    :return:
    """
    index = hash_func(hash_table.table_len, key)
    if hash_table.table[index] is None:
        return -1  # 表示该哈希表中没有key
    elif hash_table.table[index] == key:
        return index  # 返回查找的关键字在哈希表中对应下标
    else:
        # 用线性探测再散列解决冲突
        for i in range(hash_table.table_len):
            index = (index + i) % hash_table.table_len
            if hash_table.table[index] is None:
                return -1  # 表示该哈希表中没有key
            elif hash_table.table[index] == key:
                return index  # 返回查找的关键字在哈希表中对应下标


def create_hash_table(hash_table: HashTable, keys):
    for key in keys:
        index = hash_func(hash_table.table_len, key)
        if hash_table.table[index] is None:
            hash_table.table[index] = key
        elif hash_table.table[index] == key:
            continue  # 表示表中已有该关键字跳过对该关键字的再次插入
        else:
            # 用线性探测再散列解决冲突
            for i in range(hash_table.table_len):
                index = (index + i) % hash_table.table_len
                if hash_table.table[index] is None:
                    hash_table.table[index] = key
                elif hash_table.table[index] == key:
                    break  # 表示表中已有该关键字跳过对该关键字的再次插入
    return hash_table  # 返回建好的哈希表
# test_search_hash_table.py
from search_hash_search import HashTable,create_hash_table, hash_search


m = 10
hash_table = HashTable(m)
hash_table = create_hash_table(hash_table, [62, 58, 48, 95, 32, 10, 26, 42])
print(hash_table.table)
index = hash_search(hash_table, 10)
print(index)


"""
运行结果:
deque([32, 48, 58, 10, 95, 32, 62, 48, 26, 48])
3

Process finished with exit code 0
"""

[引用《数据结构–用C语言描述 耿国华版》]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值