mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-16 11:02:09 +08:00
deploy
This commit is contained in:
@@ -1637,6 +1637,8 @@
|
||||
<h2 id="622">6.2.2. 链式地址<a class="headerlink" href="#622" title="Permanent link">¶</a></h2>
|
||||
<p>在原始哈希表中,桶内的每个地址只能存储一个元素(即键值对)。<strong>考虑将单个元素转化成一个链表,将所有冲突元素都存储在一个链表中</strong>。</p>
|
||||
<p><img alt="链式地址" src="../hash_collision.assets/hash_collision_chaining.png" /></p>
|
||||
<p align="center"> Fig. 链式地址 </p>
|
||||
|
||||
<p>链式地址下,哈希表操作方法为:</p>
|
||||
<ul>
|
||||
<li><strong>查询元素</strong>:先将 key 输入到哈希函数得到桶内索引,即可访问链表头结点,再通过遍历链表查找对应 value 。</li>
|
||||
@@ -1660,6 +1662,8 @@
|
||||
<li>若遇到空位,则说明查找键值对不在哈希表中;</li>
|
||||
</ol>
|
||||
<p><img alt="线性探测" src="../hash_collision.assets/hash_collision_linear_probing.png" /></p>
|
||||
<p align="center"> Fig. 线性探测 </p>
|
||||
|
||||
<p>线性探测存在以下缺陷:</p>
|
||||
<ul>
|
||||
<li><strong>不能直接删除元素</strong>。删除元素会导致桶内出现一个空位,在查找其他元素时,该空位有可能导致程序认为元素不存在(即上述第 <code>2.</code> 种情况)。因此需要借助一个标志位来标记删除元素。</li>
|
||||
|
||||
@@ -1603,6 +1603,8 @@
|
||||
<p>哈希表通过建立「键 key」和「值 value」之间的映射,实现高效的元素查找。具体地,输入一个 key ,在哈希表中查询并获取 value ,时间复杂度为 <span class="arithmatex">\(O(1)\)</span> 。</p>
|
||||
<p>例如,给定一个包含 <span class="arithmatex">\(n\)</span> 个学生的数据库,每个学生有“姓名 <code>name</code> ”和“学号 <code>id</code> ”两项数据,希望实现一个查询功能:<strong>输入一个学号,返回对应的姓名</strong>,则可以使用哈希表实现。</p>
|
||||
<p><img alt="哈希表的抽象表示" src="../hash_map.assets/hash_map.png" /></p>
|
||||
<p align="center"> Fig. 哈希表的抽象表示 </p>
|
||||
|
||||
<h2 id="611">6.1.1. 哈希表效率<a class="headerlink" href="#611" title="Permanent link">¶</a></h2>
|
||||
<p>除了哈希表之外,还可以使用以下数据结构来实现上述查询功能:</p>
|
||||
<ol>
|
||||
@@ -1988,6 +1990,8 @@
|
||||
f(x) = x \% 100
|
||||
\]</div>
|
||||
<p><img alt="简单哈希函数示例" src="../hash_map.assets/hash_function.png" /></p>
|
||||
<p align="center"> Fig. 简单哈希函数示例 </p>
|
||||
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="3:10"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><input id="__tabbed_3_6" name="__tabbed_3" type="radio" /><input id="__tabbed_3_7" name="__tabbed_3" type="radio" /><input id="__tabbed_3_8" name="__tabbed_3" type="radio" /><input id="__tabbed_3_9" name="__tabbed_3" type="radio" /><input id="__tabbed_3_10" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Java</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Python</label><label for="__tabbed_3_4">Go</label><label for="__tabbed_3_5">JavaScript</label><label for="__tabbed_3_6">TypeScript</label><label for="__tabbed_3_7">C</label><label for="__tabbed_3_8">C#</label><label for="__tabbed_3_9">Swift</label><label for="__tabbed_3_10">Zig</label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
@@ -2832,6 +2836,8 @@ f(12836) = f(20336) = 36
|
||||
\]</div>
|
||||
<p>两个学号指向了同一个姓名,这明显是不对的,我们将这种现象称为「哈希冲突 Hash Collision」。如何避免哈希冲突的问题将被留在下章讨论。</p>
|
||||
<p><img alt="哈希冲突示例" src="../hash_map.assets/hash_collision.png" /></p>
|
||||
<p align="center"> Fig. 哈希冲突示例 </p>
|
||||
|
||||
<p>综上所述,一个优秀的「哈希函数」应该具备以下特性:</p>
|
||||
<ul>
|
||||
<li>尽量少地发生哈希冲突;</li>
|
||||
|
||||
Reference in New Issue
Block a user