This commit is contained in:
krahets
2025-01-02 21:38:22 +08:00
parent 2bbcdf6966
commit e6dbcc8008
327 changed files with 657 additions and 657 deletions
@@ -5196,7 +5196,7 @@
<p>為了解決該問題,我們可以採用<u>懶刪除(lazy deletion</u>機制:它不直接從雜湊表中移除元素,<strong>而是利用一個常數 <code>TOMBSTONE</code> 來標記這個桶</strong>。在該機制下,<code>None</code><code>TOMBSTONE</code> 都代表空桶,都可以放置鍵值對。但不同的是,線性探查到 <code>TOMBSTONE</code> 時應該繼續走訪,因為其之下可能還存在鍵值對。</p>
<p>然而,<strong>懶刪除可能會加速雜湊表的效能退化</strong>。這是因為每次刪除操作都會產生一個刪除標記,隨著 <code>TOMBSTONE</code> 的增加,搜尋時間也會增加,因為線性探查可能需要跳過多個 <code>TOMBSTONE</code> 才能找到目標元素。</p>
<p>為此,考慮線性探查中記錄遇到的首個 <code>TOMBSTONE</code> 的索引,並將搜尋到的目標元素與該 <code>TOMBSTONE</code> 交換位置。這樣做的好處是當每次查詢或新增元素時,元素會被移動至距離理想位置(探測起始點)更近的桶,從而最佳化查詢效率。</p>
<p>為此,考慮線性探查中記錄遇到的首個 <code>TOMBSTONE</code> 的索引,並將搜尋到的目標元素與該 <code>TOMBSTONE</code> 交換位置。這樣做的好處是當每次查詢或新增元素時,元素會被移動至距離理想位置(探測起始點)更近的桶,從而最佳化查詢效率。</p>
<p>以下程式碼實現了一個包含懶刪除的開放定址(線性探查)雜湊表。為了更加充分地使用雜湊表的空間,我們將雜湊表看作一個“環形陣列”,當越過陣列尾部時,回到頭部繼續走訪。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:14"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><input id="__tabbed_2_6" name="__tabbed_2" type="radio" /><input id="__tabbed_2_7" name="__tabbed_2" type="radio" /><input id="__tabbed_2_8" name="__tabbed_2" type="radio" /><input id="__tabbed_2_9" name="__tabbed_2" type="radio" /><input id="__tabbed_2_10" name="__tabbed_2" type="radio" /><input id="__tabbed_2_11" name="__tabbed_2" type="radio" /><input id="__tabbed_2_12" name="__tabbed_2" type="radio" /><input id="__tabbed_2_13" name="__tabbed_2" type="radio" /><input id="__tabbed_2_14" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python</label><label for="__tabbed_2_2">C++</label><label for="__tabbed_2_3">Java</label><label for="__tabbed_2_4">C#</label><label for="__tabbed_2_5">Go</label><label for="__tabbed_2_6">Swift</label><label for="__tabbed_2_7">JS</label><label for="__tabbed_2_8">TS</label><label for="__tabbed_2_9">Dart</label><label for="__tabbed_2_10">Rust</label><label for="__tabbed_2_11">C</label><label for="__tabbed_2_12">Kotlin</label><label for="__tabbed_2_13">Ruby</label><label for="__tabbed_2_14">Zig</label></div>
<div class="tabbed-content">
@@ -7119,7 +7119,7 @@ aria-label="頁脚"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 krahets<br>The website content is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
Copyright &copy; 2025 krahets<br>The website content is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
</div>