This commit is contained in:
krahets
2023-04-09 02:53:32 +08:00
parent c6da3ca087
commit fc4021ea99
14 changed files with 202 additions and 202 deletions

View File

@ -1681,15 +1681,15 @@
<h1 id="63">6.3. &nbsp; 小结<a class="headerlink" href="#63" title="Permanent link">&para;</a></h1>
<ul>
<li>哈希表中输入一个键 key ,查询到值 value 的时间复杂度为 <span class="arithmatex">\(O(1)\)</span> 非常高</li>
<li>哈希表的常用操作包括查询、添加与删除键值对、遍历键值对等。</li>
<li>哈希函数将 key 映射到桶(数组索引,从而访问对应的值 value 。</li>
<li>两个不同的 key 经过哈希函数可能得到相同的索引,进而发生哈希冲突,导致查询错误</li>
<li>缓解哈希冲突的途径有两种:哈希表扩容、优化哈希表的表示方</li>
<li>负载因子定义为哈希表中元素数量除以桶数量,体现哈希冲突的严重程度,常用作哈希表扩容的触发条件。与数组扩容的原理类似,哈希表扩容操作开销也很大</li>
<li>链式地址考虑将单个元素转化成一个链表,将所有冲突元素存储在一个链表中,从而解决哈希冲突。链表过长会导致查询效率变低,可以通过链表转为 AVL 树或红黑树来解决</li>
<li>开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。多次哈希使用多个哈希函数进行探测,相对线性探测不易产生聚集,代价是多个哈希函数增加了计算量。</li>
<li>在工业界中Java 的 HashMap 用链式地址Python 的 Dict 采用开放寻址。</li>
<li>哈希表能够在 <span class="arithmatex">\(O(1)\)</span> 时间内将键 key 映射到值 value效率非常高。</li>
<li>常见的哈希表操作包括查询、添加与删除键值对、遍历键值对等。</li>
<li>哈希函数将 key 映射数组索引(桶),以便访问对应的值 value 。</li>
<li>两个不同的 key 可能在经过哈希函数得到相同的索引,导致查询结果出错,这种现象被称为哈希冲突</li>
<li>缓解哈希冲突的方法主要有扩容哈希表和优化哈希表的表示方</li>
<li>负载因子定义为哈希表中元素数量除以桶数量,反映了哈希冲突的严重程度,常用作触发哈希表扩容的条件。与数组扩容类似,哈希表扩容操作也会产生较大的开销。</li>
<li>链式地址通过将单个元素转化链表,将所有冲突元素存储在一个链表中,从而解决哈希冲突。然而,过长的链表会降低查询效率,可以通过链表转为 AVL 树或红黑树来改善</li>
<li>开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。多次哈希使用多个哈希函数进行探测,相对线性探测不易产生聚集,多个哈希函数增加了计算量。</li>
<li>不同编程语言采取了不同的哈希表实现策略。例如Java 的 HashMap 使用链式地址,而 Python 的 Dict 采用开放寻址。</li>
</ul>