mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-19 15:00:58 +00:00
deploy
This commit is contained in:
@@ -4220,7 +4220,7 @@
|
||||
<p><a class="glightbox" href="../permutations_problem.assets/permutations_ii.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="重複排列" class="animation-figure" src="../permutations_problem.assets/permutations_ii.png" /></a></p>
|
||||
<p align="center"> 圖 13-7 重複排列 </p>
|
||||
|
||||
<p>那麼如何去除重複的排列呢?最直接地,考慮藉助一個雜湊表,直接對排列結果進行去重。然而這樣做不夠優雅,<strong>因為生成重複排列的搜尋分支沒有必要,應當提前識別並剪枝</strong>,這樣可以進一步提升演算法效率。</p>
|
||||
<p>那麼如何去除重複的排列呢?最直接地,考慮藉助一個雜湊集合,直接對排列結果進行去重。然而這樣做不夠優雅,<strong>因為生成重複排列的搜尋分支沒有必要,應當提前識別並剪枝</strong>,這樣可以進一步提升演算法效率。</p>
|
||||
<h3 id="1_1">1. 相等元素剪枝<a class="headerlink" href="#1_1" title="Permanent link">¶</a></h3>
|
||||
<p>觀察圖 13-8 ,在第一輪中,選擇 <span class="arithmatex">\(1\)</span> 或選擇 <span class="arithmatex">\(\hat{1}\)</span> 是等價的,在這兩個選擇之下生成的所有排列都是重複的。因此應該把 <span class="arithmatex">\(\hat{1}\)</span> 剪枝。</p>
|
||||
<p>同理,在第一輪選擇 <span class="arithmatex">\(2\)</span> 之後,第二輪選擇中的 <span class="arithmatex">\(1\)</span> 和 <span class="arithmatex">\(\hat{1}\)</span> 也會產生重複分支,因此也應將第二輪的 <span class="arithmatex">\(\hat{1}\)</span> 剪枝。</p>
|
||||
@@ -4229,7 +4229,7 @@
|
||||
<p align="center"> 圖 13-8 重複排列剪枝 </p>
|
||||
|
||||
<h3 id="2_1">2. 程式碼實現<a class="headerlink" href="#2_1" title="Permanent link">¶</a></h3>
|
||||
<p>在上一題的程式碼的基礎上,我們考慮在每一輪選擇中開啟一個雜湊表 <code>duplicated</code> ,用於記錄該輪中已經嘗試過的元素,並將重複元素剪枝:</p>
|
||||
<p>在上一題的程式碼的基礎上,我們考慮在每一輪選擇中開啟一個雜湊集合 <code>duplicated</code> ,用於記錄該輪中已經嘗試過的元素,並將重複元素剪枝:</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">
|
||||
<div class="tabbed-block">
|
||||
|
||||
@@ -3606,7 +3606,7 @@
|
||||
<li>回溯問題通常包含多個約束條件,它們可用於實現剪枝操作。剪枝可以提前結束不必要的搜尋分支,大幅提升搜尋效率。</li>
|
||||
<li>回溯演算法主要可用於解決搜尋問題和約束滿足問題。組合最佳化問題雖然可以用回溯演算法解決,但往往存在效率更高或效果更好的解法。</li>
|
||||
<li>全排列問題旨在搜尋給定集合元素的所有可能的排列。我們藉助一個陣列來記錄每個元素是否被選擇,剪掉重複選擇同一元素的搜尋分支,確保每個元素只被選擇一次。</li>
|
||||
<li>在全排列問題中,如果集合中存在重複元素,則最終結果會出現重複排列。我們需要約束相等元素在每輪中只能被選擇一次,這通常藉助一個雜湊表來實現。</li>
|
||||
<li>在全排列問題中,如果集合中存在重複元素,則最終結果會出現重複排列。我們需要約束相等元素在每輪中只能被選擇一次,這通常藉助一個雜湊集合來實現。</li>
|
||||
<li>子集和問題的目標是在給定集合中找到和為目標值的所有子集。集合不區分元素順序,而搜尋過程會輸出所有順序的結果,產生重複子集。我們在回溯前將資料進行排序,並設定一個變數來指示每一輪的走訪起始點,從而將生成重複子集的搜尋分支進行剪枝。</li>
|
||||
<li>對於子集和問題,陣列中的相等元素會產生重複集合。我們利用陣列已排序的前置條件,透過判斷相鄰元素是否相等實現剪枝,從而確保相等元素在每輪中只能被選中一次。</li>
|
||||
<li><span class="arithmatex">\(n\)</span> 皇后問題旨在尋找將 <span class="arithmatex">\(n\)</span> 個皇后放置到 <span class="arithmatex">\(n \times n\)</span> 尺寸棋盤上的方案,要求所有皇后兩兩之間無法攻擊對方。該問題的約束條件有行約束、列約束、主對角線和次對角線約束。為滿足行約束,我們採用按行放置的策略,保證每一行放置一個皇后。</li>
|
||||
|
||||
Reference in New Issue
Block a user