源内容(英文)
哈希表 是一种允许快速插入、删除和检索数据的数据结构。它通过使用哈希函数将键映射到数组中的索引来工作。在这篇文章中,我们将使用链地址法在 Python 中实现一个哈希表来处理冲突。
!哈希的组成部分哈希的组成部分
> 链地址法是处理哈希表中冲突的一种技术。当两个或多个键映射到数组中的同一个索引时,我们将它们存储在该索引处的链表中。这允许我们在同一索引处存储多个值,并且仍然能够使用它们的键来检索它们。
!image使用链地址法实现哈希表的方法
使用链地址法实现哈希表的方法:
我们需要创建两个类:‘Node‘ 和 ‘HashTable‘。
‘Node‘ 类将表示链表中的一个节点。每个节点将包含一个键值对,以及指向列表中下一个节点的指针。
Python3
CODEBLOCK_b1c55322
‘HashTable‘ 类将包含保存链表的数组,以及用于从哈希表中插入、检索和删除数据的方法。
Python3
CODEBLOCK_673487da
‘init‘ 方法使用给定的容量初始化哈希表。它设置 ‘capacity‘ 和 ‘size‘ 变量,并将数组初始化为 ‘None‘。
下一个方法是 ‘_hash‘ 方法。该方法接受一个键并返回一个数组索引,该索引指示键值对应该存储的位置。我们将使用 Python 内置的哈希函数对键进行哈希处理,然后使用模运算符来获取数组中的索引。
Python3
CODEBLOCK_587e3ce1
‘insert‘ 方法将把一个键值对插入到哈希表中。它利用 ‘_hash‘ 方法获取该键值对应该存储的索引。如果该索引处没有链表,它会创建一个包含该键值对的新节点,并将其设置为链表的头部。如果该索引处已经有一个链表,它会遍历该链表,直到找到最后一个节点或发现键已经存在。如果键已经存在,它将更新对应的值。如果没有找到键,它会创建一个新节点并将其添加到链表的头部。
Python3
CODEBLOCK_53439ae2
search 方法检索与给定键关联的值。它首先使用 _hash 方法获取键值对应该存储的索引。然后,它在该索引处的链表中搜索该键。如果找到该键,它将返回关联的值。如果没有找到该键,它将引发 KeyError。
Python3
CODEBLOCK_4f757ebd
‘remove‘ 方法从哈希表中删除一个键值对。它首先使用 INLINECODE3f6814e9 方法获取该对应该存储的索引。然后,它在该索引处的链表中搜索该键。如果找到该键,它会从链表中删除该节点。如果没有找到该键,它将引发 INLINECODEbfaaf5a5。
Python3
CODEBLOCK_c5ce9113
‘str‘ 方法返回哈希表的字符串表示形式。
Python3
INLINECODE045f60bd`INLINECODEba266bcfdictINLINECODEe1ac181ecollections.OrderedDictINLINECODEd55f8d6ddictINLINECODE319ad9aeinsertINLINECODE9fbb9e7ccollisionsINLINECODEe651b965slots(如上代码所示)来显著减少内存开销。
## 4. 未来展望:AI 时代的数据结构
随着 Agent 工作流的兴起,我们正在看到一种新的趋势:**自调整数据结构**。想象一下,我们的 HashTable` 类内置了一个简单的 AI 代理,它可以根据当前访问模式,动态地在链地址法和开放寻址法之间切换,或者自动调整负载因子参数。这种“自动驾驶”级别的系统组件,正是我们在迈向 2026 年及未来时探索的方向。
希望这篇文章不仅帮助你理解了链地址法的原理,更展示了如何将基础算法与现代工程理念相结合,构建出既经典又符合未来趋势的可靠系统。