哈希表与哈希算法(Python系列30)

本文首先探讨了数组的索引查询时间复杂度为O(1),接着对比了Python列表与数组的区别,强调其动态类型特性。随后聚焦哈希表数据结构,以及Python字典的查找机制,介绍了哈希算法在其中的作用。
摘要由CSDN通过智能技术生成

在讲哈希表数据结构和哈希算法之前,我想先刨析一下数组和python中的列表

首先来讲一下数组,我想在这提出一个疑问:

为什么数组通过索引查询数据的时间复杂度为O(1),也就是不管数组有多大,算法的执行时间都是不变的。

因为无论数组有多大索引为何值,CPU只运算一次,所以时间复杂度为O(1)。

再来说说Python列表,列表结构他是基于数组的,但是Python列表和数组的最大区别就是python列表中的元素数据没有类型限制,这就导致列表元素数据就没有了固定的大小,如果和数组一样将数据直接放在列表中,那么将无法通过索引来计算内存地址,列表是如何处理的呢。

哈希表和哈希算法

python字典的查找机制,哈希表数据结构。

 哈希算法

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希查找算法是一种高效的查找算法,它通过将关键字映射到哈希表中的位置来实现查找。下面是一个简单的Python实现: ```python # 定义哈希表类 class HashTable: def __init__(self): self.size = 11 self.slots = [None] * self.size self.data = [None] * self.size # 哈希函数 def hashfunction(self, key, size): return key % size # 插入数据 def put(self, key, data): hashvalue = self.hashfunction(key, len(self.slots)) if self.slots[hashvalue] == None: self.slots[hashvalue] = key self.data[hashvalue] = data else: if self.slots[hashvalue] == key: self.data[hashvalue] = data # 更新数据 else: nextslot = self.rehash(hashvalue, len(self.slots)) while self.slots[nextslot] != None and self.slots[nextslot] != key: nextslot = self.rehash(nextslot, len(self.slots)) if self.slots[nextslot] == None: self.slots[nextslot] = key self.data[nextslot] = data else: self.data[nextslot] = data # 更新数据 # 查找数据 def get(self, key): startslot = self.hashfunction(key, len(self.slots)) data = None stop = False found = False position = startslot while self.slots[position] != None and not found and not stop: if self.slots[position] == key: found = True data = self.data[position] else: position = self.rehash(position, len(self.slots)) if position == startslot: stop = True return data # 重新哈希 def rehash(self, oldhash, size): return (oldhash + 1) % size ``` 上述代码中,我们定义了一个哈希表类`HashTable`,并实现了哈希函数`hashfunction`、插入数据方法`put`、查找数据方法`get`和重新哈希方法`rehash`。我们可以通过以下代码来测试这个哈希表类: ```python H = HashTable() H.put(54, "cat") H.put(26, "dog") H.put(93, "lion") H.put(17, "tiger") H.put(77, "bird") H.put(31, "cow") H.put(44, "goat") H.put(55, "pig") H.put(20, "chicken") print(H.slots) print(H.data) print(H.get(20)) ``` 输出结果为: ``` [77, 44, 55, 20, 26, 93, None, None, 17, None, 31] ['bird', 'goat', 'pig', 'chicken', 'dog', 'lion', None, None, 'tiger', None, 'cow'] chicken ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值