Hello 算法 1.0.0b1 JavaScript版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 多次哈希 顾名思义,「多次哈希」的思路是使用多个哈希函数 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 6. 散列表 hello‑algo.com 89 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 90 7. 树 70 码力 | 185 页 | 14.70 MB | 1 年前3
Hello 算法 1.0.0b1 TypeScript 版线性探测存在以下缺陷: ‧ 不能直接删除元素。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认 为元素不存在(即上述第 2. 种情况)。因此需要借助一个标志位来标记删除元素。 ‧ 容易产生聚集。桶内被占用的连续位置越长,这些连续位置发生哈希冲突的可能性越大,从而进一步促 进这一位置的“聚堆生长”,最终导致增删查改操作效率的劣化。 6. 散列表 hello‑algo.com 88 多次哈希 查找元素:以相同的哈希函数顺序查找,存在两种情况: 1. 找到目标元素,则返回之; 2. 到空位或已尝试所有哈希函数,说明哈希表中无此元素; 相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 链表过长会导致查询效率变低,可以通过把链表转化为 AVL 树或红黑树来解决。 ‧ 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。 多次哈希使用多个哈希函数进行探测,相对线性探测不容易产生聚集,代价是多个哈希函数增加了计算 量。 ‧ 在工业界中,Java 的 HashMap 采用链式地址、Python 的 Dict 采用开放寻址。 89 7. 树0 码力 | 186 页 | 14.71 MB | 1 年前3
Hello 算法 1.1.0 Dart版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 hello‑algo.com 124 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 平方探测主要具有以下优势。 第 6 章 哈希表 hello‑algo.com 128 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 378 页 | 18.45 MB | 1 年前3
Hello 算法 1.1.0 JavaScript版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 hello‑algo.com 123 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 定的步数,而是跳过“探测次数的平方”的步数,即 1, 4, 9, … 步。 平方探测主要具有以下优势。 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.1.0 TypeScript版据此哈希函数,最后两位相同的 key 都会被映 射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 定的步数,而是跳过“探测次数的平方”的步数,即 1, 4, 9, … 步。 平方探测主要具有以下优势。 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 383 页 | 18.49 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Dart 版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 www.hello‑algo.com 124 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 平方探测主要具有以下优势。 第 6 章 哈希表 www.hello‑algo.com 128 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 378 页 | 18.46 MB | 10 月前3
Hello 算法 1.2.0 简体中文 JavaScript 版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 www.hello‑algo.com 123 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 定的步数,而是跳过“探测次数的平方”的步数,即 1, 4, 9, … 步。 平方探测主要具有以下优势。 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 379 页 | 18.47 MB | 10 月前3
Hello 算法 1.0.0 JavaScript版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 hello‑algo.com 122 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 定的步数,而是跳过“探测次数的平方”的步数,即 1, 4, 9, … 步。 平方探测主要具有以下优势。 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 � 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的 问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.0.0 Dart版射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 第 6 章 哈希表 hello‑algo.com 124 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 平方探测主要具有以下优势。 第 6 章 哈希表 hello‑algo.com 128 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 � 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的 问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 377 页 | 17.56 MB | 1 年前3
Hello 算法 1.2.0 简体中文 TypeScript 版据此哈希函数,最后两位相同的 key 都会被映 射到相同的桶。而通过线性探测,它们被依次存储在该桶以及之下的桶中。 图 6‑6 开放寻址(线性探测)哈希表的键值对分布 然而,线性探测容易产生“聚集现象”。具体来说,数组中连续被占用的位置越长,这些连续位置发生哈希冲 突的可能性越大,从而进一步促使该位置的聚堆生长,形成恶性循环,最终导致增删查改操作效率劣化。 值得注意的是,我们不能在开放寻 定的步数,而是跳过“探测次数的平方”的步数,即 1, 4, 9, … 步。 平方探测主要具有以下优势。 ‧ 平方探测通过跳过探测次数平方的距离,试图缓解线性探测的聚集效应。 ‧ 平方探测会跳过更大的距离来寻找空位置,有助于数据分布得更加均匀。 然而,平方探测并不是完美的。 ‧ 仍然存在聚集现象,即某些位置比其他位置更容易被占用。 ‧ 由于平方的增长,平方探测可能不会探测整个哈希表,这意味着即使哈希表中有空桶,平方探测也可能 ,以此类推,直到找到空位后插入元素。 ‧ 查找元素:在相同的哈希函数顺序下进行查找,直到找到目标元素时返回;若遇到空位或已尝试所有哈 希函数,说明哈希表中不存在该元素,则返回 None 。 与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会带来额外的计算量。 Tip 请注意,开放寻址(线性探测、平方探测和多次哈希)哈希表都存在“不能直接删除元素”的问题。 6.2.3 编程语言的选择 各种编程语言采取了不同的哈希表实现策略,下面举几个例子。0 码力 | 383 页 | 18.49 MB | 10 月前3
共 17 条
- 1
- 2













