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
@@ -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">
@@ -39,7 +39,7 @@
<title>2.1 アルゴリズム効率評価 - Hello アルゴリズム</title>
<title>2.1 アルゴリズム効率評価 - Hello アルゴリズム</title>
@@ -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>
@@ -152,7 +152,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
</span>
</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; アルゴリズムとは
@@ -794,7 +794,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -812,7 +812,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -842,7 +842,7 @@
<a href="#211" class="md-nav__link">
<span class="md-ellipsis">
2.1.1 &nbsp;際のテスト
2.1.1 &nbsp;
</span>
</a>
@@ -853,7 +853,7 @@
<a href="#212" class="md-nav__link">
<span class="md-ellipsis">
2.1.2 &nbsp; 理論的推定
2.1.2 &nbsp; 理論的な見積もり
</span>
</a>
@@ -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; 一緒に作に参加しましょう
@@ -4299,7 +4299,7 @@
<a href="#211" class="md-nav__link">
<span class="md-ellipsis">
2.1.1 &nbsp;際のテスト
2.1.1 &nbsp;
</span>
</a>
@@ -4310,7 +4310,7 @@
<a href="#212" class="md-nav__link">
<span class="md-ellipsis">
2.1.2 &nbsp; 理論的推定
2.1.2 &nbsp; 理論的な見積もり
</span>
</a>
@@ -4354,44 +4354,44 @@
<!-- Page content -->
<h1 id="21">2.1 &nbsp; アルゴリズム効率評価<a class="headerlink" href="#21" title="Permanent link">&para;</a></h1>
<p>アルゴリズム設計において、私たちは順序に従って以下の2つの目標を追求します。</p>
<h1 id="21">2.1 &nbsp; アルゴリズム効率評価<a class="headerlink" href="#21" title="Permanent link">&para;</a></h1>
<p>アルゴリズム設計では、次の 2 つのレベルの目標を順に追求します。</p>
<ol>
<li><strong>問題の解決策を見つける</strong>: アルゴリズムは、指定された入力範囲内で確実に正しい解を見つけることができるべきです。</li>
<li><strong>最適解を求め</strong>: 同じ問題に対して複数の解決策が存在する場合があり、私たちは可能な限り最も効率的なアルゴリズムを見つけることを目指します。</li>
<li><strong>問題の解を見つける</strong>アルゴリズムは、定められた入力範囲内で問題の正しい解を確実に求められる必要があります。</li>
<li><strong>最適な解法を追求す</strong>同じ問題に対して複数の解が存在する場合があり、私たちはできるだけ効率的なアルゴリズムを見つけたいと考えます。</li>
</ol>
<p>つまり、問題を解決できることを前提として、アルゴリズム効率がアルゴリズムを評価する主要な基準となっており、これには以下の2つの次元が含まれます。</p>
<p>つまり、問題を解ることを前提として、アルゴリズム効率はその良し悪しを測る主要な評価指標となっており、次の 2 つの観点を含みます。</p>
<ul>
<li><strong>時間効率</strong>: アルゴリズム実行される速度</li>
<li><strong>空間効率</strong>: アルゴリズムが占有するメモリ空間のサイズ</li>
<li><strong>時間効率</strong>アルゴリズム実行時間の長さ。</li>
<li><strong>空間効率</strong>アルゴリズムが使用するメモリ空間の大きさ</li>
</ul>
<p>要するに、<strong>私たちの目標は高速でメモリ効率の良いデータ構造とアルゴリズムを設計することです</strong>アルゴリズム効率を効果的に評価することは重要です。なぜなら、そうすることで初めて様々なアルゴリズムを比較し、アルゴリズム設計と最適化プロセスを導くことができるからです。</p>
<p>効率評価は主に2つの方法があります:実際のテストと理論的推定です。</p>
<h2 id="211">2.1.1 &nbsp;際のテスト<a class="headerlink" href="#211" title="Permanent link">&para;</a></h2>
<p>アルゴリズム<code>A</code><code>B</code>があり、どちらも同じ問題を解決でき、それらの効率を比較する必要があるとします。最も直接的な方法はコンピュータを使用してこれら2つのアルゴリズムを実行し、実行時間とメモリ使用量を監視記録することです。この評価方法は実際の状況を反映ますが、大きな制限があります。</p>
<p>一方で<strong>テスト環境からの干渉を排除することは困難です</strong>。ハードウェア構成はアルゴリズムの性能に影響を与える可能性があります。えば、並列度の高いアルゴリズムはマルチコアCPUでの実行により適していますし、集約的なメモリ操作を含むアルゴリズムは高性能メモリでより良い性能を発揮します。アルゴリズムのテスト結果は、異なるマシン間で変わる可能性があります。これは、平均効率を計算するために複数のマシンでテストすることが実用的でないことを意味します</p>
<p>方で<strong>完全なテストを実施することは非常にリソース集約的です</strong>。アルゴリズムの効率は入力データサイズによって変わります。えば、データ量が少ない場合はアルゴリズム<code>A</code><code>B</code>より速く実行される可能性がありますが、データ量が多い場合はテスト結果が逆になる可能性があります。したがって、説得力のある結論を導くためには、幅広い入力データサイズをテストする必要があり、れには過度な計算リソースが必要になります。</p>
<h2 id="212">2.1.2 &nbsp; 理論的推定<a class="headerlink" href="#212" title="Permanent link">&para;</a></h2>
<p>際のテストの大きな制限により、計算のみでアルゴリズムの効率を評価することを検討できます。この推定方法は<u>漸近的複雑度解析</u>、または単に<u>複雑度解析</u>して知られています。</p>
<p>複雑度解析は、アルゴリズムの実行に必要な時間と空間リソースと入力データのサイズとの関係を反映します。<strong>これは、入力データのサイズが増加するにつれて、アルゴリズムに必要な時間と空間の増加傾向を記述します</strong>。この定義は複雑に聞こえるかもしれませんが、より良く理解するために3つの重要なポイントに分解できます。</p>
<p>簡単に言えば、**私たちの目標は高速でメモリ」なデータ構造とアルゴリズムを設計すること**です。そして、アルゴリズム効率を効果的に評価することは非常に重要です。そうすることで初めて、さまざまなアルゴリズムを比較し、さらにアルゴリズム設計と最適化の過程を導けるからです。</p>
<p>効率評価方法は主に 2 種類に分けられます。実測と理論的な見積もりです。</p>
<h2 id="211">2.1.1 &nbsp;<a class="headerlink" href="#211" title="Permanent link">&para;</a></h2>
<p>いまアルゴリズム <code>A</code> とアルゴリズム <code>B</code> があり、どちらも同じ問題を解けるとします。この 2 つのアルゴリズムの効率を比較する必要がある場合、最も直接的な方法は 1 台のコンピュータで両者を実行し、その実行時間とメモリ使用量を監視して記録することです。この評価方法は実際の状況を反映できますが、大きな制約もあります。</p>
<p>一方では、**テスト環境による干渉要因を排除しにくい**という問題があります。ハードウェア構成はアルゴリズムの性能に影響ます。たとえば、並列度の高いアルゴリズムはマルチコア CPU での実行により適しており、メモリアクセスが集中的なアルゴリズムは高性能メモリでより良い性能をします。つまり、異なるマシンでのテスト結果は一致しない可能性があります。これは、さまざまなマシンでテストして平均効率を統計的に求める必要があることを意味しますが、それは現実的ではありません</p>
<p>方では、**完全なテストを実施するは非常に多くの資源が必要**です。入力データ量が変化すると、アルゴリズムは異なる効率を示します。たとえば、入力データ量が小さいときはアルゴリズム <code>A</code> の実行時間がアルゴリズム <code>B</code> より短くても、入力データ量が大きいときには結果がちょうど逆になるかもしれません。そのため、説得力のある結論を得るには、さまざまな規模の入力データテストする必要があり、れには大量の計算資源を要します。</p>
<h2 id="212">2.1.2 &nbsp; 理論的な見積もり<a class="headerlink" href="#212" title="Permanent link">&para;</a></h2>
<p>測には大きな制約があるため、いくつかの計算だけによってアルゴリズムの効率を評価することを考えられます。この見積もり方法は<u>漸近計算量解析(asymptotic complexity analysis</u>と呼ばれ、略して<u>計算量解析</u>います。</p>
<p>計算量解析は、アルゴリズムの実行に必要な時間資源と空間資源が入力データ規模とどのような関係にあるかを表します。<strong>これは、入力データ規模が増加するにつれて、アルゴリズムの実行に必要な時間と空間がどのように増加するかという傾向を記述するものです</strong>。この定義はややわかりにくいので、次の 3 つのポイントに分けて理解できます。</p>
<ul>
<li>「時間と空間リソース」は、それぞれ<u>時間計算量</u><u>空間計算量</u>に対応します。</li>
<li>「入力データのサイズが増加するにつれて」は、複雑度がアルゴリズムの効率と入力データとの関係を反映ることを意味します。</li>
<li>「時間と空間の増加傾向」は、複雑度解析が実行時間や占有空間の具体的な値ではなく、時間や空間増加する「率」に焦点を当てることを示します。</li>
<li>「時間資源と空間資源」は、それぞれ<u>時間計算量time complexity</u><u>空間計算量space complexity</u>に対応します。</li>
<li>「入力データ規模が増加するにつれて」は、計算量がアルゴリズムの実行効率と入力データ規模との関係を反映していることを意味します。</li>
<li>「時間と空間の増加傾向」は、計算量解析が注目するのは実行時間や使用空間の具体的な値ではなく、時間や空間増加の「速さ」であることを示します。</li>
</ul>
<p><strong>複雑度解析は実際のテスト方法の欠点を克服します</strong>これは以下の側面で反映されます</p>
<p><strong>計算量解析は実測という方法の欠点を克服しています</strong>その点は次のように表れます</p>
<ul>
<li>実際にコードを実行する必要がないため、より環境にしくエネルギー効率が良いです。</li>
<li>テスト環境に依存せず、すべての動作プラットフォームに適用できます。</li>
<li>異なるデータ量でのアルゴリズム効率を反映でき、特に大量データでのアルゴリズムの性能を示します。</li>
<li>実際にコードを動かす必要がな、より環境にやさしくエネルギーです。</li>
<li>テスト環境から独立しており、解析結果はすべての実行プラットフォームに適用できます。</li>
<li>異なるデータ量におけるアルゴリズム効率を表せ、とくに大規模データでの性能を反映できます。</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>複雑度の概念についてまだ混乱している場合でも、心配しないでください。以降の章で詳しく取り上げます。</p>
<p>それでも計算量の概念がまだわかりにくくても、心配はいりません。後続の章で詳しく説明します。</p>
</div>
<p>複雑度解析は、アルゴリズム効率を評価する「ものさし」を提供し、実行に必要な時間と空間リソースを測定し、異なるアルゴリズムの効率を比較することを可能にします。</p>
<p>複雑度は数学的概念であり、初者には抽象的で困難かもしれません。この観点から、複雑度解析は最初に紹介するのに最も適したトピックではないかもしれません。しかし、特定のデータ構造やアルゴリズムの特性について議論するとき、その速度空間使用量を分析することを避けるのは困難です</p>
<p>要約すると、データ構造とアルゴリズム深く入る前に複雑度解析の基本的な理解を身につけることをお勧めします。<strong>これにより、簡単なアルゴリズムで複雑度解析を実行できるようになります</strong></p>
<p>計算量解析は、アルゴリズム効率を評価するための「物差し」を私たちに与えてくれます。これにより、あるアルゴリズムの実行に必要な時間資源と空間資源を測り、異なるアルゴリズム同士の効率を比較できます。</p>
<p>計算量は数学的概念であり、初者にとってはやや抽象的で、学習の難度も比較的高いかもしれません。この観点から見ると、計算量解析は最初に紹介する内容としてはあまり適していない可能性があります。しかし、あるデータ構造やアルゴリズムの特徴を議論する際には、その実行速度空間使用状況の分析を避けることはできません</p>
<p>以上を踏まえると、データ構造とアルゴリズム深く学ぶ前に、**まず計算量解析について初歩的な理解を持ち、簡単なアルゴリズムの計算量解析ができるようにしておくこと**を勧めます</p>
<!-- Source file information -->
@@ -4414,7 +4414,7 @@ aria-label="フッター"
<a
href="../"
class="md-footer__link md-footer__link--prev"
aria-label="前: 第 2 章 &amp;nbsp; 複雑度解析"
aria-label="前: 第 2 章 &amp;nbsp; 計算量解析"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4426,7 +4426,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
第 2 章 &nbsp; 複雑度解析
第 2 章 &nbsp; 計算量解析
</div>
</div>
</a>