This commit is contained in:
krahets
2023-02-26 22:45:57 +08:00
parent c20bdb15ac
commit ccfe99d31c
56 changed files with 7768 additions and 85 deletions

View File

@ -364,6 +364,8 @@
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
@ -406,6 +408,20 @@
<li class="md-nav__item">
<a href="../../chapter_introduction/summary/" class="md-nav__link">
1.3. &nbsp; 小结
</a>
</li>
</ul>
</nav>
</li>
@ -1065,6 +1081,8 @@
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
@ -1107,6 +1125,20 @@
<li class="md-nav__item">
<a href="../../chapter_heap/summary/" class="md-nav__link">
8.3. &nbsp; 小结
</a>
</li>
</ul>
</nav>
</li>
@ -1138,6 +1170,8 @@
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
@ -1194,6 +1228,20 @@
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
9.4. &nbsp; 小结
</a>
</li>
</ul>
</nav>
</li>
@ -1528,6 +1576,17 @@
<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>
</ul>