哈希导论2024 年 8 月 28 日 | 阅读 6 分钟 假设我们要创建一个系统来存储包含电话号码(作为键)的员工记录。我们还希望以下查询能够快速运行:
我们可以考虑使用以下数据结构来存储各种电话号码的信息:
对于数组和链表,我们必须进行线性搜索,这在实践中可能成本很高。如果我们使用数组并将数据保持排序状态,我们可以使用二分查找以 O(Logn) 的时间找到电话号码,但插入和删除操作会变得昂贵,因为我们必须保持数据排序。 通过平衡二叉搜索树,我们获得了中等的搜索、插入和删除时间。所有这些操作都将在 O(Logn) 时间内完成。 “访问列表”(access-list)是指用于控制网络流量和减少网络攻击的规则集。ACL 用于根据传入或传出流量定义的规则集来过滤网络流量。 另一种选择是使用直接访问表,在这种表中,我们创建一个大型数组,并将电话号码用作索引。如果电话号码不存在,则数组条目为 NIL;否则,数组条目存储指向对应于电话号码的记录的指针。在时间复杂度方面,这个解决方案是最好的;我们可以以 O(1) 的时间执行所有操作。例如,要插入电话号码,我们创建一个包含电话号码详细信息的记录,使用电话号码作为索引,并将指向新创建记录的指针存储在表中。 这个解决方案有许多实际的缺点。这个解决方案的第一个问题是所需的额外空间量。例如,如果一个电话号码有 n 位数字,我们需要 O(m * 10n) 的表空间,其中 m 是指向记录的指针的大小。另一个问题是,编程语言中的整数无法容纳 n 位数字。 由于上述限制,不能总是使用直接访问表。在实践中,哈希是几乎所有此类情况都可以使用的解决方案,并且优于数组、链表和平衡 BST 等上述数据结构。哈希的平均搜索时间为 O(1)(在合理假设下),最坏情况为 O(n)。让我们分解一下什么是哈希。 哈希到底是什么意思?哈希是一种流行的快速存储和检索数据的方法。使用哈希的主要原因在于,它通过执行最优搜索来产生最优结果。 为什么你应该使用哈希?如果我们尝试在平衡二叉搜索树中搜索、插入或删除任何元素,相同操作的时间复杂度为 O(logn)。现在,有时我们的应用程序需要以更快、更优化的方式执行相同的操作,这就是哈希发挥作用的地方。哈希中的所有上述操作都可以在 O(1) 或常数时间内完成。了解哈希的最坏情况时间复杂度仍然是 O(n),但平均时间复杂度为 O(1) 至关重要。 现在让我们看一些基本的哈希操作。 基本操作
描述哈希函数。
哈希表:它是什么?
哈希的组成部分
一个好的哈希函数应该具备以下特性:
例如,对于电话号码,使用前三位数字是一个糟糕的哈希函数。考虑后三位数字是一个更好的函数。请注意,这个哈希函数可能不是最好的。可能有更好的选择。
线性探测在数据结构中,哈希会产生已经被用来存储值的数组索引。在这种情况下,哈希执行搜索操作并线性探测下一个空单元格。 在哈希算法中,处理哈希表冲突的最简单方法称为线性探测(linear probing)。任何发生的冲突都可以通过顺序搜索找到。 二次哈希(Double Hashing)二次哈希方法使用两个哈希函数。当第一个哈希函数导致冲突时,使用第二个哈希函数。为了存储值,它提供了一个偏移索引。 二次哈希方法的公式如下: (firstHash(key) + i * secondHash(key)) % sizeOfTable 偏移值由 i 表示。偏移值不断增加,直到遇到一个空槽。 下一主题冲突处理的链表法 |
我们请求您订阅我们的新闻通讯以获取最新更新。