This commit is contained in:
Yudong Jin 2022-12-13 01:53:31 +08:00
parent 7a00ea3324
commit 98818eb1f1
3 changed files with 7 additions and 7 deletions

View File

@ -1490,12 +1490,12 @@
<h1 id="_1">哈希冲突处理<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<p>理想情况下,哈希函数应该为每个输入产生唯一的输出,使得 key 和 value 一一对应。而实际上,往往存在不同 key 对应相同 value 的情况,这种情况被称为「哈希冲突 Hash Collision」。</p>
<p><strong>哈希冲突会严重影响哈希表的实用性</strong>。试想一下,如果在哈希表中总是查找到错误的结果,那么我们肯定不会继续使用这样的数据结构了。</p>
<p>然而,即使我们设计了一个足够好的「哈希函数」,却仍然无法杜绝哈希冲突问题,这是因为:</p>
<ul>
<li>哈希表的桶的大小(地址范围)是有限的,只要数据量足够大,理论上一定会出现冲突;</li>
<li>哈希函数很难使键值对完全均匀分布,这也增大了冲突发生的可能性。</li>
</ul>
<p>虽然理论上哈希冲突无法避免,但我们仍然可以在数据结构与算法的层面缓解冲突问题,尽量保证哈希表的增删查改操作效率。<strong>常见的哈希冲突的解决方案有「链式地址」和「开放寻址」</strong></p>
<div class="admonition question">
<p class="admonition-title">为什么会出现哈希冲突?</p>
<p>因为 <strong>哈希函数的输入空间往往远大于输出空间</strong>,所以不可避免地会出现多个输入产生相同输出的情况。比如,输入空间是全体整数,输出空间是一个固定大小的桶(数组)的索引范围,那么必定会有多个整数同时映射到一个桶索引。</p>
</div>
<p>虽然理论上哈希冲突难以避免,<strong>但我们仍然可以在数据结构层面上缓解哈希冲突所带来的负面影响</strong>,尽量保证哈希表的增删查改操作效率。</p>
<p>常见的哈希冲突的解决方案有「链式地址」和「开放寻址」。</p>
<h2 id="_2">链式地址<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<p>「链式地址」通过引入链表来解决哈希冲突问题,代价是占用空间变大,因为链表或二叉树包含结点指针,相比于数组更加耗费内存空间。</p>
<h3 id="_3">链表引入<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>

File diff suppressed because one or more lines are too long

Binary file not shown.