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

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; アルゴリズム効率評価
@@ -1132,7 +1132,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1160,7 +1160,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1663,7 +1663,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1685,7 +1685,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1707,7 +1707,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -2014,7 +2014,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2177,7 +2177,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2563,7 +2563,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2619,7 +2619,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2647,7 +2647,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3185,7 +3185,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3241,7 +3241,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3269,7 +3269,7 @@
<span class="md-ellipsis">
12.4 &nbsp; ハノイの塔問題
12.4 &nbsp; ハノイの塔問題
@@ -3462,7 +3462,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分集合和問題
13.3 &nbsp; 部分和問題
@@ -3490,7 +3490,7 @@
<span class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
@@ -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; 一緒に作に参加しましょう
@@ -4355,46 +4355,46 @@
<!-- Page content -->
<h1 id="31">3.1 &nbsp; データ構造の分類<a class="headerlink" href="#31" title="Permanent link">&para;</a></h1>
<p>一般的なデータ構造には、配列、連結リスト、スタック、キュー、ハッシュ、木、ヒープ、グラフがあります。これらは「論理構造」と「物理構造」分類できます。</p>
<p>代表的なデータ構造には、配列、連結リスト、スタック、キュー、ハッシュテーブル、木、ヒープ、グラフがありこれらは「論理構造」と「物理構造」の 2 つの観点から分類できます。</p>
<h2 id="311">3.1.1 &nbsp; 論理構造:線形と非線形<a class="headerlink" href="#311" title="Permanent link">&para;</a></h2>
<p><strong>論理構造はデータ要素間の論理的関係を明らかにします</strong>。配列と連結リストでは、データは定の順序で配置され、データ間の線形関係を示しています。一方、木ではデータは上から下へ階層的に配置され、「祖先」と「子孫」の派生関係を示しています。そして、グラフはノードとエッジから構成され、複雑なネットワーク関係を反映しています。</p>
<p>下図に示されているように、論理構造は「線形」と「非線形」の2つの主要カテゴリに分けることができます。線形構造はより直感的で、データが論理関係において線形に配置されていることを示しています。非線形構造は、逆に非線形に配置されています。</p>
<p><strong>論理構造はデータ要素間の論理的関係をします</strong>。配列と連結リストでは、データは定の順序で並び、データ間の線形関係を表します。一方、木ではデータは上から下へ階層的に並び、「祖先」と「子孫」の派生関係を示します。グラフはノードと辺で構成され、複雑なネットワーク関係を反映します。</p>
<p>以下の図に示すように、論理構造は「線形」と「非線形」の 2 つに大別できます。線形構造は比較的直感的で、データが論理関係において線形に並ぶことを指します。非線形構造はその逆で、非線形に配置されます。</p>
<ul>
<li><strong>線形データ構造</strong>:配列、連結リスト、スタック、キュー、ハッシュ表。要素が一対一の順関係を持ちます。</li>
<li><strong>非線形データ構造</strong>:木、ヒープ、グラフ、ハッシュ</li>
<li><strong>線形データ構造</strong>:配列、連結リスト、スタック、キュー、ハッシュテーブルであり、要素間は 1 対 1 の順関係す。</li>
<li><strong>非線形データ構造</strong>:木、ヒープ、グラフ、ハッシュテーブル</li>
</ul>
<p>非線形データ構造は、さらに木構造とネットワーク構造に分けることができます。</p>
<p>非線形データ構造は、さらに木構造と網状構造に分けられます。</p>
<ul>
<li><strong>木構造</strong>:木、ヒープ、ハッシュ表。要素が一対多の関係を持ちます。</li>
<li><strong>ネットワーク構造</strong>:グラフ。要素が多対多の関係を持ちます。</li>
<li><strong>木構造</strong>:木、ヒープ、ハッシュテーブルであり、要素間は 1 対多の関係す。</li>
<li><strong>網状構造</strong>:グラフであり、要素間は多対多の関係す。</li>
</ul>
<p><img alt="Linear and non-linear data structures" class="animation-figure" src="../classification_of_data_structure.assets/classification_logic_structure.png" /></p>
<p align="center"> 図 3-1 &nbsp; Linear and non-linear data structures </p>
<p><img alt="線形データ構造と非線形データ構造" class="animation-figure" src="../classification_of_data_structure.assets/classification_logic_structure.png" /></p>
<p align="center"> 図 3-1 &nbsp; 線形データ構造と非線形データ構造 </p>
<h2 id="312">3.1.2 &nbsp; 物理構造:連続と分散<a class="headerlink" href="#312" title="Permanent link">&para;</a></h2>
<p><strong>アルゴリズムの実行中、処理されるデータはメモリに格納されます</strong>。下図はコンピュータのメモリスティックを示しており、各黒い正方形は物理メモリ空間です。メモリ巨大なExcelスプレッドシートと考えることができ、各セルは一定量のデータを格納できます。</p>
<p><strong>システムはメモリアドレスによって目標位置のデータアクセスします</strong>。下図に示されているように、コンピュータは特定のルールに従って表の各セルに一意の識別子を割り当て、各メモリ空間が一意のメモリアドレスを持つことを保証します。これらのアドレスにより、プログラムはメモリに格納されたデータにアクセスできます。</p>
<p><img alt="Memory stick, memory spaces, memory addresses" class="animation-figure" src="../classification_of_data_structure.assets/computer_memory_location.png" /></p>
<p align="center"> 図 3-2 &nbsp; Memory stick, memory spaces, memory addresses </p>
<p><strong>アルゴリズムのプログラムが実行されるとき、処理中のデータは主にメモリに格納されます</strong>。下図はコンピュータのメモリモジュールを示しており、各黒い四角はそれぞれ 1 つのメモリ空間を表しています。メモリ巨大な Excel の表のようなものだと考えることができ、各セルは一定量のデータを格納できます。</p>
<p><strong>システムはメモリアドレスを通じて目的の位置にあるデータアクセスします</strong>。下図に示ように、コンピュータは特定の規則に従って表の各セルに番号を割り当て、各メモリ空間が一意のメモリアドレスを持つようにします。これらのアドレスがあれば、プログラムはメモリ内のデータにアクセスできます。</p>
<p><img alt="メモリモジュール、メモリ空間、メモリアドレス" class="animation-figure" src="../classification_of_data_structure.assets/computer_memory_location.png" /></p>
<p align="center"> 図 3-2 &nbsp; メモリモジュール、メモリ空間、メモリアドレス </p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>メモリをExcelスプレッドシートに比較することは簡略化された類推であることに注意してください。メモリの実際の動作メカニズムはより複雑で、アドレス空間、メモリ管理、キャッシュメカニズム、仮想メモリ、物理メモリなどの概念が関係しています。</p>
<p>補足すると、メモリを Excel の表にたとえるのは単純化した比喩であり、実際のメモリの動作機構はより複雑で、アドレス空間、メモリ管理、キャッシュ機構、仮想メモリ、物理メモリなどの概念が関わります。</p>
</div>
<p>メモリはすべてのプログラム共有リソースです。あるメモリブロックが1つのプログラムによって占有されると、他のプログラムが同時に使用することはできません。<strong>したがって、メモリリソースはデータ構造とアルゴリズムの設計における重要な考慮事項です</strong>えば、アルゴリズムのピークメモリ使用量は、システムの残り空きメモリを超えてはいけません。連続したメモリブロックが不足している場合は、非連続メモリブロックに格納できるデータ構造を選択する必要があります。</p>
<p>下図に示されているように、<strong>物理構造はコンピュータメモリにおけるデータの格納方法を反映し</strong>連続空間格納(配列)と非連続空間格納(連結リスト)に分けることができます。2つのタイプの物理構造は時間効率と空間効率の観点で補完的な特性を示します。</p>
<p><img alt="Contiguous space storage and dispersed space storage" class="animation-figure" src="../classification_of_data_structure.assets/classification_phisical_structure.png" /></p>
<p align="center"> 図 3-3 &nbsp; Contiguous space storage and dispersed space storage </p>
<p>メモリはすべてのプログラム共有される資源であり、あるメモリ領域が 1 つのプログラムに占有されると、通常は他のプログラムが同時に利用できません。<strong>したがって、データ構造とアルゴリズムの設計では、メモリ資源は重要な考慮要素です</strong>たとえば、アルゴリズムが使用するメモリ使用量のピークは、システムに残っている空きメモリを超えてはなりません。大きな連続メモリ領域が不足している場合、選択するデータ構造は分散したメモリ空間に格納できる必要があります。</p>
<p>下図に示ように、<strong>物理構造はデータがコンピュータメモリ内にどのように格納されるかを表します</strong>。これは連続空間への格納(配列)と分散空間への格納(連結リスト)に分けられます。物理構造は低レベルでデータのアクセス、更新、追加、削除などの操作方法を決定し、2 種類の物理構造は時間効率と空間効率の面で相補的な特徴を持ちます。</p>
<p><img alt="連続空間格納と分散空間格納" class="animation-figure" src="../classification_of_data_structure.assets/classification_phisical_structure.png" /></p>
<p align="center"> 図 3-3 &nbsp; 連続空間格納と分散空間格納 </p>
<p><strong>すべてのデータ構造は配列、連結リスト、またはその組み合わせに基づいて実装されていることに注意してください</strong>えば、スタックとキューは配列または連結リストのどちらでも実装できます。ハッシュの実装には配列と連結リストの両方が関係する場合があります。</p>
<p>補足すると、<strong>すべてのデータ構造は配列、連結リスト、またはその両者の組み合わせに基づいて実装されます</strong>たとえば、スタックとキューは配列でも連結リストでも実装できます。一方、ハッシュテーブルの実装には配列と連結リストの両方が含まれる場合があります。</p>
<ul>
<li><strong>配列ベースの実装</strong>:スタック、キュー、ハッシュ、木、ヒープ、グラフ、行列、テンソル(次元<span class="arithmatex">\(\geq 3\)</span>の配列)。</li>
<li><strong>連結リストベースの実装</strong>:スタック、キュー、ハッシュ、木、ヒープ、グラフなど。</li>
<li><strong>配列に基づいて実装可能</strong>:スタック、キュー、ハッシュテーブル、木、ヒープ、グラフ、行列、テンソル(次元 <span class="arithmatex">\(\geq 3\)</span> の配列)など</li>
<li><strong>連結リストに基づいて実装可能</strong>:スタック、キュー、ハッシュテーブル、木、ヒープ、グラフなど。</li>
</ul>
<p>配列に基づいて実装されたデータ構造は「静的データ構造」とも呼ばれ初期化後に長さを変更できないことを意味します。逆に、連結リストに基づいたものは「動的データ構造」と呼ばれ、プログラム実行中にサイズを調整できます。</p>
<p>連結リストは初期化後も、プログラムの実行中に長さを調整できるため、「動的データ構造」とも呼ばれます。配列は初期化後に長さを変更できないため、「静的データ構造」と呼ばれます。なお、配列もメモリを再割り当てすることで長さを変更でき、ある程度の「動的性」を持たせることができます。</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>物理構造理解するのが困難な場合は、次の章「配列と連結リスト」を読んでから、この節に戻ることを勧めます。</p>
<p>物理構造理解が難しいと感じる場合は、先に次の章を読んでから本節を振り返ることを勧めます。</p>
</div>
<!-- Source file information -->