This commit is contained in:
krahets
2026-03-30 08:17:41 +08:00
parent 68cafe99dd
commit 46bccf0065
484 changed files with 60193 additions and 20315 deletions
+49 -49
View File
@@ -6,7 +6,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="アニメーション図解ワンクリック実行データ構造とアルゴリズムチュートリアル">
<meta name="description" content="アニメーション図解ワンクリック実行コードで学べるデータ構造とアルゴリズムの入門書">
<meta name="author" content="krahets">
@@ -117,7 +117,7 @@
<path
d="M480 32c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9L381.7 53c-48 48-113.1 75-181 75H192 160 64c-35.3 0-64 28.7-64 64v96c0 35.3 28.7 64 64 64l0 128c0 17.7 14.3 32 32 32h64c17.7 0 32-14.3 32-32V352l8.7 0c67.9 0 133 27 181 75l43.6 43.6c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6V300.4c18.6-8.8 32-32.5 32-60.4s-13.4-51.6-32-60.4V32zm-64 76.7V240 371.3C357.2 317.8 280.5 288 200.7 288H192V192h8.7c79.8 0 156.5-29.8 215.3-83.3z" />
</svg>
<span>日本語版審閱者を募集しています!詳細<a href="https://github.com/krahets/hello-algo/blob/main/ja/CONTRIBUTING.md">CONTRIBUTING.md</a>参照してください。</span>
<span>日本語版のレビュアーを募集しています。詳しく<a href="/ja/chapter_appendix/contribution/">こちら</a>ご覧ください。</span>
</div>
</div>
@@ -341,7 +341,7 @@
<span class="md-ellipsis">
はじめに
@@ -358,7 +358,7 @@
<span class="md-nav__icon md-icon"></span>
はじめに
</label>
@@ -618,7 +618,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
@@ -646,7 +646,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -783,7 +783,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -1060,7 +1060,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1088,7 +1088,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1591,7 +1591,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1613,7 +1613,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1635,7 +1635,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -1942,7 +1942,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2105,7 +2105,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2491,7 +2491,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2547,7 +2547,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2575,7 +2575,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3113,7 +3113,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3169,7 +3169,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3197,7 +3197,7 @@
<span class="md-ellipsis">
12.4 &nbsp; ハノイの塔問題
12.4 &nbsp; ハノイの塔問題
@@ -3392,7 +3392,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分集合和問題
13.3 &nbsp; 部分和問題
@@ -3420,7 +3420,7 @@
<span class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
@@ -3505,7 +3505,7 @@
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
1. &nbsp; 重要な復習
1. &nbsp; 重要なポイントの振り返り
</span>
</a>
@@ -3631,7 +3631,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法の初歩
14.1 &nbsp; 動的計画法入門
@@ -3659,7 +3659,7 @@
<span class="md-ellipsis">
14.2 &nbsp; DP 問題特性
14.2 &nbsp; 動的計画法の問題特性
@@ -3687,7 +3687,7 @@
<span class="md-ellipsis">
14.3 &nbsp; DP の解法の考え方
14.3 &nbsp; 動的計画法の問題解決の考え方
@@ -3715,7 +3715,7 @@
<span class="md-ellipsis">
14.4 &nbsp; 0-1ナップサック問題
14.4 &nbsp; 0-1 ナップサック問題
@@ -3908,7 +3908,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲アルゴリズム
15.1 &nbsp; 貪欲
@@ -4153,7 +4153,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に作に参加する
16.2 &nbsp; 一緒に作に参加しましょう
@@ -4299,7 +4299,7 @@
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
1. &nbsp; 重要な復習
1. &nbsp; 重要なポイントの振り返り
</span>
</a>
@@ -4355,25 +4355,25 @@
<!-- Page content -->
<h1 id="135">13.5 &nbsp; まとめ<a class="headerlink" href="#135" title="Permanent link">&para;</a></h1>
<h3 id="1">1. &nbsp; 重要な復習<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<h3 id="1">1. &nbsp; 重要なポイントの振り返り<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<ul>
<li>バックトラッキングアルゴリズムの本質は全探索です。解空間深さ優先走査を実行することで条件を満たす解を求めます。検索中に満足のいく解が見つかった場合、それを記録し、すべての解見つるか走査が完了するまで続けます。</li>
<li>バックトラッキングアルゴリズムの検索プロセスには試行と後退が含まれます。深さ優先探索を使用して様々な選択を探索し、選択が制約を満たさない場合、前の選択を取り消します。そして前の状態に戻って他のオプションを試し続けます。試行と後退は反対方向の操作です。</li>
<li>バックトラッキング問題には通常複数の制約が含まれます。これらの制約は剪定操作を実行するために使用できます。剪定は不要な索分岐を事前に終了し、検索効率を大幅に向上させることができます。</li>
<li>バックトラッキングアルゴリズムは主に索問題と制約足問題解決するために使用されます。組み合わせ最適化問題バックトラッキングを使用して解決できますが、多くの場合、より効率または効果的な解決方法が利用可能です</li>
<li>順列問題は、与えられた集合要素のすべての可能な順列を検索することを目的とします。各要素が選択されたかどうかを記録するために配列を使用し、同じ要素重複選択を避けます。これにより、各要素が度だけ選択されることが保証されます。</li>
<li>順列問題では、集合に重複要素が含まれている場合、最終結果に重複順列が含まれます。同一要素が各ラウンドで一度だけ選択できるように制する必要があり、これは通常ハッシュセットを使用して実装されます。</li>
<li>部分集合和問題は、与えられた集合でターゲット値に合計する全ての部分集合を見つけることを目的とします。集合は要素順序を区別しませんが、検索プロセスでは重複する部分集合が生成される可能性があります。これは、アルゴリズムが異なる要素順序を独特のパスとして探索するために発生します。バックトラッキング前にデータをソートし、各ラウンドの走査開始を示す変数を設定します。これにより、重複する部分集合を生成する索分岐を剪定できます。</li>
<li>部分集合和問題では、配列の等しい要素重複集合を生成する可能性があります。配列がすでにソートされているという前提条件を使用し、隣接する要素が等しいかどうかを判定することで剪定を行います。これにより、等しい要素がラウンドごとに一度だけ選択されることが保証されます。</li>
<li><span class="arithmatex">\(n\)</span> クイーン問題は、2つのクイーンが互いに攻撃できないように <span class="arithmatex">\(n \times n\)</span>チェスボード<span class="arithmatex">\(n\)</span> 個のクイーンを配置する方を見つけることを目的とします。問題の制約には行制約、列制約、および主対角線副対角線制約が含まれます。行制約を満たすため、行ごとに1つのクイーンを配置する戦略を採用し、各行に1つのクイーンが配置されることを保証します。</li>
<li>列制約と対角線制約の処理は似ています。列制約については、各列にクイーンがるかどうかを記録する配列を使用し、選択されたセルが合法かどうかをします。対角線制約については、2つの配列を使用して主対角線と副対角線それぞれクイーン存在記録します。課題は、同じ主対角線または副対角線上のセルの行と列のインデックス間の関係を決定することです。</li>
<li>バックトラッキングアルゴリズムの本質は全探索法であり、解空間深さ優先走査することで条件を満たす解を探索します。探索の過程で条件を満たす解に出会ったら記録し、すべての解見つるか探索が完了するまで続けます。</li>
<li>バックトラッキングアルゴリズムの探索過程は、試行と戻るという 2 つの部分から成ります。深さ優先探索によってさまざまな選択を試し、制約条件を満たさない状況に遭遇した場合は直前の選択を取り消して前の状態に戻り、ほかの選択を引き続き試します。試行と戻るは互いに逆方向の操作です。</li>
<li>バックトラッキング問題には通常複数の制約条件が含まれており、それらを枝刈りに利用できます。枝刈りによって不要な索分岐を早期に打ち切り、探索効率を大幅に高められます。</li>
<li>バックトラッキングアルゴリズムは主に索問題と制約足問題解決に用いられます。組せ最適化問題バックトラッキングで解けますが、より効率またはより適した解法が存在することが少なくありません</li>
<li>順列問題の目的は、与えられた集合要素のすべての可能な並べ方を探索することです。各要素が選択済みかどうかを配列で記録し、同じ要素重複して選ぶ探索分岐を刈り取ることで、各要素が 1 度だけ選ばれるようにします。</li>
<li>順列問題では、集合に重複要素があると最終結果に重複した順列がれます。各ラウンドで等しい要素は 1 回しか選べないように制する必要があり、通常ハッシュ集合を用いて実現します。</li>
<li>部分和問題の目標は、与えられた集合の中から和が目標値となるすべての部分集合を見つけることす。集合は要素順序を区別しませんが、探索過程では順序違いの結果も出力されるため、重複部分集合が生じます。そこで、バックトラッキング前にデータをソートし、各ラウンドの走査開始位置を示す変数を設定することで、重複部分集合を生成する索分岐を枝刈りします。</li>
<li>部分和問題では、配列の等しい要素重複集合を生みます。配列がソート済みであるという前提を利用し、隣接要素が等しいかどうかを判定して枝刈りすることで、等しい要素がラウンドで 1 回しか選ばれないようにします。</li>
<li><span class="arithmatex">\(n\)</span> クイーン問題の目的は、<span class="arithmatex">\(n \times n\)</span>盤面<span class="arithmatex">\(n\)</span> 個のクイーンを配置する方を見つけることであり、どの 2 つのクイーンも互いに攻撃できないことが条件です。この問題の制約には行制約、列制約、主対角線制約、副対角線制約があります。行制約を満たすため、行ごとに配置する戦略を採用し、各行に 1 個のクイーンを置くことを保証します。</li>
<li>列制約と対角線制約の扱い方は似ています。列制約については、各列にクイーンが存在するかどうかを配列で記録し、選択したマスが有効かどうかを判定します。対角線制約については、主対角線と副対角線それぞれクイーン存在するかを 2 つの配列で記録します。難点は、同じ主対角線または副対角線上にあるマスが満たす行列インデックスの規則を見つけることにあります。</li>
</ul>
<h3 id="2-q-a">2. &nbsp; Q &amp; A<a class="headerlink" href="#2-q-a" title="Permanent link">&para;</a></h3>
<p><strong>Q</strong>: バックトラッキングと再帰の関係どのように理解すればよいですか?</p>
<p>全体的に、バックトラッキングは「アルゴリズム戦略」であり、再帰はより「ツール」です。</p>
<p><strong>Q</strong>バックトラッキングと再帰の関係どのように理解すればよいですか?</p>
<p>全体として見ると、バックトラッキングは「アルゴリズム戦略」の一種であり、再帰はむしろ「道具」に近いものです。</p>
<ul>
<li>バックトラッキングアルゴリズムは通常再帰に基づいてます。しかし、バックトラッキングは再帰の応用シナリオの一つであり、特に検索問題においてです。</li>
<li>再帰の構造は「部分問題分解」問題解決パラダイムを反映します。分割統治、バックトラッキング、動的プログラミング(メモ化再帰)を含む問題の解決でよく使用されます。</li>
<li>バックトラッキングアルゴリズムは通常再帰に基づいて実装されます。ただし、バックトラッキングは再帰の応用場面の 1 つであり、索問題における再帰の応用です。</li>
<li>再帰の構造は「部分問題への分解」という問題解決パラダイムを表しており、分割統治、バックトラッキング、動的計画法(メモ化再帰)などの問題によく用いられます。</li>
</ul>
<!-- Source file information -->
@@ -4397,7 +4397,7 @@ aria-label="フッター"
<a
href="../n_queens_problem/"
class="md-footer__link md-footer__link--prev"
aria-label="前: 13.4 &amp;nbsp; Nクイーン問題"
aria-label="前: 13.4 &amp;nbsp; n クイーン問題"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4409,7 +4409,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
</div>
</div>
</a>
@@ -4421,7 +4421,7 @@ aria-label="フッター"
<a
href="../../chapter_dynamic_programming/"
class="md-footer__link md-footer__link--next"
aria-label="次: 第 14 章 &amp;nbsp; 動的プログラミング"
aria-label="次: 第 14 章 &amp;nbsp; 動的計画法"
rel="next"
>
<div class="md-footer__title">
@@ -4429,7 +4429,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
第 14 章 &nbsp; 動的プログラミング
第 14 章 &nbsp; 動的計画法
</div>
</div>
<div class="md-footer__button md-icon">