mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-22 11:26:07 +00:00
deploy
This commit is contained in:
@@ -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 章 複雑度解析 - Hello アルゴリズム</title>
|
||||
<title>第 2 章 計算量解析 - 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 章 複雑度解析
|
||||
第 2 章 計算量解析
|
||||
|
||||
</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 アルゴリズムはどこにでもある
|
||||
1.1 アルゴリズムは至るところにある
|
||||
|
||||
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
1.2 アルゴリズムとは何か
|
||||
1.2 アルゴリズムとは
|
||||
|
||||
|
||||
|
||||
@@ -785,7 +785,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
2.1 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
|
||||
|
||||
|
||||
@@ -1062,7 +1062,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.3 数値の符号化 *
|
||||
3.3 数値エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1090,7 +1090,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.4 文字の符号化 *
|
||||
3.4 文字エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1593,7 +1593,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -1615,7 +1615,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1637,7 +1637,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
6.1 ハッシュ表
|
||||
6.1 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -1944,7 +1944,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
7.5 AVL木 *
|
||||
7.5 AVL 木 *
|
||||
|
||||
|
||||
|
||||
@@ -2107,7 +2107,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
8.2 ヒープ構築操作
|
||||
8.2 ヒープ構築
|
||||
|
||||
|
||||
|
||||
@@ -2493,7 +2493,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.2 二分探索の挿入点
|
||||
10.2 二分探索の挿入位置
|
||||
|
||||
|
||||
|
||||
@@ -2549,7 +2549,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.4 ハッシュ最適化戦略
|
||||
10.4 ハッシュによる最適化戦略
|
||||
|
||||
|
||||
|
||||
@@ -2577,7 +2577,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.5 探索アルゴリズムの再認識
|
||||
10.5 探索アルゴリズム再考
|
||||
|
||||
|
||||
|
||||
@@ -3115,7 +3115,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.1 分割統治アルゴリズム
|
||||
12.1 分割統治法
|
||||
|
||||
|
||||
|
||||
@@ -3171,7 +3171,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.3 木の構築問題
|
||||
12.3 二分木の構築問題
|
||||
|
||||
|
||||
|
||||
@@ -3199,7 +3199,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.4 ハノイの塔問題
|
||||
12.4 ハノイの塔の問題
|
||||
|
||||
|
||||
|
||||
@@ -3392,7 +3392,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.3 部分集合和問題
|
||||
13.3 部分和問題
|
||||
|
||||
|
||||
|
||||
@@ -3420,7 +3420,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.4 Nクイーン問題
|
||||
13.4 n クイーン問題
|
||||
|
||||
|
||||
|
||||
@@ -3561,7 +3561,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.1 動的計画法の初歩
|
||||
14.1 動的計画法入門
|
||||
|
||||
|
||||
|
||||
@@ -3589,7 +3589,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.2 DP 問題の特性
|
||||
14.2 動的計画法の問題特性
|
||||
|
||||
|
||||
|
||||
@@ -3617,7 +3617,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.3 DP の解法の考え方
|
||||
14.3 動的計画法の問題解決の考え方
|
||||
|
||||
|
||||
|
||||
@@ -3645,7 +3645,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.4 0-1ナップサック問題
|
||||
14.4 0-1 ナップサック問題
|
||||
|
||||
|
||||
|
||||
@@ -3838,7 +3838,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
15.1 貪欲アルゴリズム
|
||||
15.1 貪欲法
|
||||
|
||||
|
||||
|
||||
@@ -4083,7 +4083,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
16.2 一緒に創作に参加する
|
||||
16.2 一緒に制作に参加しましょう
|
||||
|
||||
|
||||
|
||||
@@ -4273,16 +4273,16 @@
|
||||
|
||||
|
||||
<!-- Page content -->
|
||||
<h1 id="2">第 2 章 複雑度解析<a class="headerlink" href="#2" title="Permanent link">¶</a></h1>
|
||||
<p><img alt="Complexity analysis" class="cover-image" src="../assets/covers/chapter_complexity_analysis.jpg" /></p>
|
||||
<h1 id="2">第 2 章 計算量解析<a class="headerlink" href="#2" title="Permanent link">¶</a></h1>
|
||||
<p><img alt="計算量解析" class="cover-image" src="../assets/covers/chapter_complexity_analysis.jpg" /></p>
|
||||
<div class="admonition abstract">
|
||||
<p class="admonition-title">Abstract</p>
|
||||
<p>複雑度解析は、アルゴリズムの広大な宇宙における時空のナビゲーターのようなものです。</p>
|
||||
<p>時間と空間の次元をより深く探求し、より優雅な解決策を求めるためのガイドとなります。</p>
|
||||
<p>計算量解析は、広大なアルゴリズム宇宙における時空の案内人のようなものです。</p>
|
||||
<p>それは、時間と空間という二つの次元で私たちをより深く探求へ導き、より洗練された解決策を見つけ出します。</p>
|
||||
</div>
|
||||
<h2 id="_1">章の内容<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li><a href="performance_evaluation/">2.1 アルゴリズムの効率評価</a></li>
|
||||
<li><a href="performance_evaluation/">2.1 アルゴリズム効率の評価</a></li>
|
||||
<li><a href="iteration_and_recursion/">2.2 反復と再帰</a></li>
|
||||
<li><a href="time_complexity/">2.3 時間計算量</a></li>
|
||||
<li><a href="space_complexity/">2.4 空間計算量</a></li>
|
||||
@@ -4334,7 +4334,7 @@ aria-label="フッター"
|
||||
<a
|
||||
href="./performance_evaluation/"
|
||||
class="md-footer__link md-footer__link--next"
|
||||
aria-label="次: 2.1 &nbsp; アルゴリズムの効率評価"
|
||||
aria-label="次: 2.1 &nbsp; アルゴリズム効率の評価"
|
||||
rel="next"
|
||||
>
|
||||
<div class="md-footer__title">
|
||||
@@ -4342,7 +4342,7 @@ aria-label="フッター"
|
||||
次
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
2.1 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-footer__button md-icon">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
|
||||
</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 アルゴリズムはどこにでもある
|
||||
1.1 アルゴリズムは至るところにある
|
||||
|
||||
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
1.2 アルゴリズムとは何か
|
||||
1.2 アルゴリズムとは
|
||||
|
||||
|
||||
|
||||
@@ -794,7 +794,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
2.1 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
|
||||
|
||||
|
||||
@@ -812,7 +812,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
2.1 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
|
||||
|
||||
|
||||
@@ -842,7 +842,7 @@
|
||||
<a href="#211" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
2.1.1 実際のテスト
|
||||
2.1.1 実測
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -853,7 +853,7 @@
|
||||
<a href="#212" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
2.1.2 理論的推定
|
||||
2.1.2 理論的な見積もり
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -1132,7 +1132,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.3 数値の符号化 *
|
||||
3.3 数値エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1160,7 +1160,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.4 文字の符号化 *
|
||||
3.4 文字エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1663,7 +1663,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -1685,7 +1685,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1707,7 +1707,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
6.1 ハッシュ表
|
||||
6.1 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -2014,7 +2014,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
7.5 AVL木 *
|
||||
7.5 AVL 木 *
|
||||
|
||||
|
||||
|
||||
@@ -2177,7 +2177,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
8.2 ヒープ構築操作
|
||||
8.2 ヒープ構築
|
||||
|
||||
|
||||
|
||||
@@ -2563,7 +2563,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.2 二分探索の挿入点
|
||||
10.2 二分探索の挿入位置
|
||||
|
||||
|
||||
|
||||
@@ -2619,7 +2619,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.4 ハッシュ最適化戦略
|
||||
10.4 ハッシュによる最適化戦略
|
||||
|
||||
|
||||
|
||||
@@ -2647,7 +2647,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.5 探索アルゴリズムの再認識
|
||||
10.5 探索アルゴリズム再考
|
||||
|
||||
|
||||
|
||||
@@ -3185,7 +3185,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.1 分割統治アルゴリズム
|
||||
12.1 分割統治法
|
||||
|
||||
|
||||
|
||||
@@ -3241,7 +3241,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.3 木の構築問題
|
||||
12.3 二分木の構築問題
|
||||
|
||||
|
||||
|
||||
@@ -3269,7 +3269,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.4 ハノイの塔問題
|
||||
12.4 ハノイの塔の問題
|
||||
|
||||
|
||||
|
||||
@@ -3462,7 +3462,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.3 部分集合和問題
|
||||
13.3 部分和問題
|
||||
|
||||
|
||||
|
||||
@@ -3490,7 +3490,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.4 Nクイーン問題
|
||||
13.4 n クイーン問題
|
||||
|
||||
|
||||
|
||||
@@ -3631,7 +3631,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.1 動的計画法の初歩
|
||||
14.1 動的計画法入門
|
||||
|
||||
|
||||
|
||||
@@ -3659,7 +3659,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.2 DP 問題の特性
|
||||
14.2 動的計画法の問題特性
|
||||
|
||||
|
||||
|
||||
@@ -3687,7 +3687,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.3 DP の解法の考え方
|
||||
14.3 動的計画法の問題解決の考え方
|
||||
|
||||
|
||||
|
||||
@@ -3715,7 +3715,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.4 0-1ナップサック問題
|
||||
14.4 0-1 ナップサック問題
|
||||
|
||||
|
||||
|
||||
@@ -3908,7 +3908,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
15.1 貪欲アルゴリズム
|
||||
15.1 貪欲法
|
||||
|
||||
|
||||
|
||||
@@ -4153,7 +4153,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
16.2 一緒に創作に参加する
|
||||
16.2 一緒に制作に参加しましょう
|
||||
|
||||
|
||||
|
||||
@@ -4299,7 +4299,7 @@
|
||||
<a href="#211" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
2.1.1 実際のテスト
|
||||
2.1.1 実測
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -4310,7 +4310,7 @@
|
||||
<a href="#212" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
2.1.2 理論的推定
|
||||
2.1.2 理論的な見積もり
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -4354,44 +4354,44 @@
|
||||
|
||||
|
||||
<!-- Page content -->
|
||||
<h1 id="21">2.1 アルゴリズムの効率評価<a class="headerlink" href="#21" title="Permanent link">¶</a></h1>
|
||||
<p>アルゴリズム設計において、私たちは順序に従って以下の2つの目標を追求します。</p>
|
||||
<h1 id="21">2.1 アルゴリズム効率の評価<a class="headerlink" href="#21" title="Permanent link">¶</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 実際のテスト<a class="headerlink" href="#211" title="Permanent link">¶</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 理論的推定<a class="headerlink" href="#212" title="Permanent link">¶</a></h2>
|
||||
<p>実際のテストの大きな制限により、計算のみでアルゴリズムの効率を評価することを検討できます。この推定方法は<u>漸近的複雑度解析</u>、または単に<u>複雑度解析</u>として知られています。</p>
|
||||
<p>複雑度解析は、アルゴリズムの実行に必要な時間と空間リソースと入力データのサイズとの関係を反映します。<strong>これは、入力データのサイズが増加するにつれて、アルゴリズムに必要な時間と空間の増加傾向を記述します</strong>。この定義は複雑に聞こえるかもしれませんが、より良く理解するために3つの重要なポイントに分解できます。</p>
|
||||
<p>簡単に言えば、**私たちの目標は「高速で省メモリ」なデータ構造とアルゴリズムを設計すること**です。そして、アルゴリズム効率を効果的に評価することは非常に重要です。そうすることで初めて、さまざまなアルゴリズムを比較し、さらにアルゴリズム設計と最適化の過程を導けるからです。</p>
|
||||
<p>効率の評価方法は主に 2 種類に分けられます。実測と理論的な見積もりです。</p>
|
||||
<h2 id="211">2.1.1 実測<a class="headerlink" href="#211" title="Permanent link">¶</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 理論的な見積もり<a class="headerlink" href="#212" title="Permanent link">¶</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 章 &nbsp; 複雑度解析"
|
||||
aria-label="前: 第 2 章 &nbsp; 計算量解析"
|
||||
rel="prev"
|
||||
>
|
||||
<div class="md-footer__button md-icon">
|
||||
@@ -4426,7 +4426,7 @@ aria-label="フッター"
|
||||
前
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
第 2 章 複雑度解析
|
||||
第 2 章 計算量解析
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 アルゴリズムはどこにでもある
|
||||
1.1 アルゴリズムは至るところにある
|
||||
|
||||
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
1.2 アルゴリズムとは何か
|
||||
1.2 アルゴリズムとは
|
||||
|
||||
|
||||
|
||||
@@ -785,7 +785,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
2.1 アルゴリズムの効率評価
|
||||
2.1 アルゴリズム効率の評価
|
||||
|
||||
|
||||
|
||||
@@ -954,7 +954,7 @@
|
||||
<a href="#1" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
1. 重要なレビュー
|
||||
1. 要点の振り返り
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -1132,7 +1132,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.3 数値の符号化 *
|
||||
3.3 数値エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1160,7 +1160,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
3.4 文字の符号化 *
|
||||
3.4 文字エンコーディング *
|
||||
|
||||
|
||||
|
||||
@@ -1663,7 +1663,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -1685,7 +1685,7 @@
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
|
||||
|
||||
第 6 章 ハッシュ表
|
||||
第 6 章 ハッシュテーブル
|
||||
|
||||
|
||||
</label>
|
||||
@@ -1707,7 +1707,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
6.1 ハッシュ表
|
||||
6.1 ハッシュテーブル
|
||||
|
||||
|
||||
|
||||
@@ -2014,7 +2014,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
7.5 AVL木 *
|
||||
7.5 AVL 木 *
|
||||
|
||||
|
||||
|
||||
@@ -2177,7 +2177,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
8.2 ヒープ構築操作
|
||||
8.2 ヒープ構築
|
||||
|
||||
|
||||
|
||||
@@ -2563,7 +2563,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.2 二分探索の挿入点
|
||||
10.2 二分探索の挿入位置
|
||||
|
||||
|
||||
|
||||
@@ -2619,7 +2619,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.4 ハッシュ最適化戦略
|
||||
10.4 ハッシュによる最適化戦略
|
||||
|
||||
|
||||
|
||||
@@ -2647,7 +2647,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
10.5 探索アルゴリズムの再認識
|
||||
10.5 探索アルゴリズム再考
|
||||
|
||||
|
||||
|
||||
@@ -3185,7 +3185,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.1 分割統治アルゴリズム
|
||||
12.1 分割統治法
|
||||
|
||||
|
||||
|
||||
@@ -3241,7 +3241,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.3 木の構築問題
|
||||
12.3 二分木の構築問題
|
||||
|
||||
|
||||
|
||||
@@ -3269,7 +3269,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
12.4 ハノイの塔問題
|
||||
12.4 ハノイの塔の問題
|
||||
|
||||
|
||||
|
||||
@@ -3462,7 +3462,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.3 部分集合和問題
|
||||
13.3 部分和問題
|
||||
|
||||
|
||||
|
||||
@@ -3490,7 +3490,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
13.4 Nクイーン問題
|
||||
13.4 n クイーン問題
|
||||
|
||||
|
||||
|
||||
@@ -3631,7 +3631,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.1 動的計画法の初歩
|
||||
14.1 動的計画法入門
|
||||
|
||||
|
||||
|
||||
@@ -3659,7 +3659,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.2 DP 問題の特性
|
||||
14.2 動的計画法の問題特性
|
||||
|
||||
|
||||
|
||||
@@ -3687,7 +3687,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.3 DP の解法の考え方
|
||||
14.3 動的計画法の問題解決の考え方
|
||||
|
||||
|
||||
|
||||
@@ -3715,7 +3715,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
14.4 0-1ナップサック問題
|
||||
14.4 0-1 ナップサック問題
|
||||
|
||||
|
||||
|
||||
@@ -3908,7 +3908,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
15.1 貪欲アルゴリズム
|
||||
15.1 貪欲法
|
||||
|
||||
|
||||
|
||||
@@ -4153,7 +4153,7 @@
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
16.2 一緒に創作に参加する
|
||||
16.2 一緒に制作に参加しましょう
|
||||
|
||||
|
||||
|
||||
@@ -4299,7 +4299,7 @@
|
||||
<a href="#1" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
1. 重要なレビュー
|
||||
1. 要点の振り返り
|
||||
|
||||
</span>
|
||||
</a>
|
||||
@@ -4355,44 +4355,47 @@
|
||||
|
||||
<!-- Page content -->
|
||||
<h1 id="25">2.5 まとめ<a class="headerlink" href="#25" title="Permanent link">¶</a></h1>
|
||||
<h3 id="1">1. 重要なレビュー<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p><strong>アルゴリズム効率評価</strong></p>
|
||||
<h3 id="1">1. 要点の振り返り<a class="headerlink" href="#1" title="Permanent link">¶</a></h3>
|
||||
<p><strong>アルゴリズム効率の評価</strong></p>
|
||||
<ul>
|
||||
<li>時間効率と空間効率は、アルゴリズムの優劣を評価する2つの主要な基準です。</li>
|
||||
<li>実際のテストによってアルゴリズムの効率を評価できますが、テスト環境の影響を排除することは困難で、大量の計算リソースを消費します。</li>
|
||||
<li>複雑度分析は実際のテストの欠点を克服できます。その結果はすべての動作プラットフォームに適用でき、異なるデータスケールでのアルゴリズムの効率を明らかにできます。</li>
|
||||
<li>時間効率と空間効率は、アルゴリズムの良し悪しを測る二つの主要な評価指標です。</li>
|
||||
<li>実測によってアルゴリズム効率を評価できますが、テスト環境の影響を排除しにくく、多くの計算資源も消費します。</li>
|
||||
<li>複雑度分析は実測の欠点を補い、分析結果はすべての実行プラットフォームに適用でき、データ規模ごとの効率も明らかにできます。</li>
|
||||
</ul>
|
||||
<p><strong>時間計算量</strong></p>
|
||||
<ul>
|
||||
<li>時間計算量は、データ量の増加に伴うアルゴリズムの実行時間の傾向を測定し、アルゴリズムの効率を効果的に評価します。しかし、入力データ量が少ない場合や時間計算量が同じ場合など、特定のケースでは失敗することがあり、アルゴリズムの効率を正確に比較することが困難になります。</li>
|
||||
<li>最悪ケース時間計算量はビッグ<span class="arithmatex">\(O\)</span>記法を使用して表記され、漸近上限を表し、<span class="arithmatex">\(n\)</span>が無限大に近づくにつれての操作数<span class="arithmatex">\(T(n)\)</span>の増加レベルを反映します。</li>
|
||||
<li>時間計算量の計算には2つのステップが含まれます:まず操作数をカウントし、次に漸近上限を決定します。</li>
|
||||
<li>一般的な時間計算量は、低いものから高いものへと並べると、<span class="arithmatex">\(O(1)\)</span>、<span class="arithmatex">\(O(\log n)\)</span>、<span class="arithmatex">\(O(n)\)</span>、<span class="arithmatex">\(O(n \log n)\)</span>、<span class="arithmatex">\(O(n^2)\)</span>、<span class="arithmatex">\(O(2^n)\)</span>、<span class="arithmatex">\(O(n!)\)</span>などが含まれます。</li>
|
||||
<li>一部のアルゴリズムの時間計算量は固定されておらず、入力データの分布に依存します。時間計算量は最悪、最良、平均のケースに分けられます。最良ケースは、入力データが最良ケースを達成するために厳格な条件を満たす必要があるため、ほとんど使用されません。</li>
|
||||
<li>平均時間計算量は、ランダムデータ入力下でのアルゴリズムの効率を反映し、実際のアプリケーションでのアルゴリズムの性能に密接に類似しています。平均時間計算量の計算には、入力データの分布とその後の数学的期待値を考慮する必要があります。</li>
|
||||
<li>時間計算量は、アルゴリズムの実行時間がデータ量の増加に伴ってどう変化するかを測るためのものであり、効率評価に有効です。ただし、入力データ量が小さい場合や時間計算量が同じ場合などには、効率の優劣を正確に比較できないことがあります。</li>
|
||||
<li>最悪時間計算量はビッグオー記法 <span class="arithmatex">\(O\)</span> で表され、関数の漸近上界に対応し、<span class="arithmatex">\(n\)</span> が正の無限大に近づくときの操作回数 <span class="arithmatex">\(T(n)\)</span> の増加の度合いを表します。</li>
|
||||
<li>時間計算量の推定は二段階に分かれ、まず操作回数を数え、次に漸近上界を判断します。</li>
|
||||
<li>一般的な時間計算量を低い順から並べると、<span class="arithmatex">\(O(1)\)</span>、<span class="arithmatex">\(O(\log n)\)</span>、<span class="arithmatex">\(O(n)\)</span>、<span class="arithmatex">\(O(n \log n)\)</span>、<span class="arithmatex">\(O(n^2)\)</span>、<span class="arithmatex">\(O(2^n)\)</span>、<span class="arithmatex">\(O(n!)\)</span> などがあります。</li>
|
||||
<li>一部のアルゴリズムの時間計算量は固定ではなく、入力データの分布に関係します。時間計算量には最悪、最良、平均時間計算量がありますが、最良時間計算量は入力データが厳しい条件を満たす必要があるため、ほとんど使われません。</li>
|
||||
<li>平均時間計算量は、ランダムな入力データに対するアルゴリズムの実行効率を表し、実運用時の性能に最も近い指標です。平均時間計算量を求めるには、入力データの分布と、それを踏まえた数学的期待値を統計する必要があります。</li>
|
||||
</ul>
|
||||
<p><strong>空間計算量</strong></p>
|
||||
<ul>
|
||||
<li>空間計算量は、時間計算量と同様に、データ量の増加に伴うアルゴリズムが占有するメモリ空間の傾向を測定します。</li>
|
||||
<li>アルゴリズムの実行中に使用される関連メモリ空間は、入力空間、一時空間、出力空間に分けることができます。一般的に、入力空間は空間計算量の計算に含まれません。一時空間は一時データ、スタックフレーム空間、命令空間に分けることができ、スタックフレーム空間は通常、再帰関数でのみ空間計算量に影響します。</li>
|
||||
<li>通常は最悪ケース空間計算量のみに焦点を当てます。これは、最悪の入力データと操作の最悪の瞬間でのアルゴリズムの空間計算量を計算することを意味します。</li>
|
||||
<li>一般的な空間計算量は、低いものから高いものへと並べると、<span class="arithmatex">\(O(1)\)</span>、<span class="arithmatex">\(O(\log n)\)</span>、<span class="arithmatex">\(O(n)\)</span>、<span class="arithmatex">\(O(n^2)\)</span>、<span class="arithmatex">\(O(2^n)\)</span>などが含まれます。</li>
|
||||
<li>空間計算量の役割は時間計算量に似ており、アルゴリズムが使用するメモリ空間がデータ量の増加に伴ってどう変化するかを測ります。</li>
|
||||
<li>アルゴリズム実行中に関係するメモリ空間は、入力空間、一時空間、出力空間に分けられます。通常、入力空間は空間計算量の計算に含めません。一時空間は一時データ、スタックフレーム空間、命令空間に分けられ、このうちスタックフレーム空間は通常、再帰関数でのみ空間計算量に影響します。</li>
|
||||
<li>私たちは通常、最悪空間計算量のみに注目し、最悪の入力データと最悪の実行時点における空間計算量を数えます。</li>
|
||||
<li>一般的な空間計算量を低い順から並べると、<span class="arithmatex">\(O(1)\)</span>、<span class="arithmatex">\(O(\log n)\)</span>、<span class="arithmatex">\(O(n)\)</span>、<span class="arithmatex">\(O(n^2)\)</span>、<span class="arithmatex">\(O(2^n)\)</span> などがあります。</li>
|
||||
</ul>
|
||||
<h3 id="2-q-a">2. Q & A<a class="headerlink" href="#2-q-a" title="Permanent link">¶</a></h3>
|
||||
<p><strong>Q</strong>: 末尾再帰の空間計算量は<span class="arithmatex">\(O(1)\)</span>ですか?</p>
|
||||
<p>理論的には、末尾再帰関数の空間計算量は<span class="arithmatex">\(O(1)\)</span>に最適化できます。しかし、ほとんどのプログラミング言語(Java、Python、C++、Go、C#など)は末尾再帰の自動最適化をサポートしていないため、一般的に空間計算量は<span class="arithmatex">\(O(n)\)</span>と考えられています。</p>
|
||||
<p><strong>Q</strong>: 「関数」と「メソッド」という用語の違いは何ですか?</p>
|
||||
<p><u>関数</u>は独立して実行でき、すべてのパラメータが明示的に渡されます。<u>メソッド</u>はオブジェクトに関連付けられ、それを呼び出すオブジェクトに暗黙的に渡され、クラスのインスタンス内に含まれるデータを操作できます。</p>
|
||||
<p>一般的なプログラミング言語からの例をいくつか示します:</p>
|
||||
<p><strong>Q</strong>:尾再帰の空間計算量は <span class="arithmatex">\(O(1)\)</span> ですか?</p>
|
||||
<p>理論上、尾再帰関数の空間計算量は <span class="arithmatex">\(O(1)\)</span> まで最適化できます。ただし、ほとんどのプログラミング言語(Java、Python、C++、Go、C# など)は尾再帰の自動最適化をサポートしていないため、通常は空間計算量を <span class="arithmatex">\(O(n)\)</span> と見なします。</p>
|
||||
<p><strong>Q</strong>:関数とメソッドという二つの用語の違いは何ですか?</p>
|
||||
<p><u>関数(function)</u>は独立して実行でき、すべての引数は明示的に渡されます。<u>メソッド(method)</u>はオブジェクトに関連付けられ、それを呼び出すオブジェクトが暗黙的に渡され、クラスのインスタンスに含まれるデータを操作できます。</p>
|
||||
<p>以下では、いくつかの一般的なプログラミング言語を例に説明します。</p>
|
||||
<ul>
|
||||
<li>Cは手続き型プログラミング言語で、オブジェクト指向の概念がないため、関数のみがあります。しかし、構造体(struct)を作成することでオブジェクト指向プログラミングをシミュレートでき、これらの構造体に関連付けられた関数は他のプログラミング言語のメソッドと同等です。</li>
|
||||
<li>JavaとC#はオブジェクト指向プログラミング言語で、コードブロック(メソッド)は通常クラスの一部です。静的メソッドはクラスにバインドされ、特定のインスタンス変数にアクセスできないため、関数のように動作します。</li>
|
||||
<li>C++とPythonは手続き型プログラミング(関数)とオブジェクト指向プログラミング(メソッド)の両方をサポートしています。</li>
|
||||
<li>C 言語は手続き型プログラミング言語であり、オブジェクト指向の概念がないため、関数しかありません。ただし、構造体(struct)を作成してオブジェクト指向プログラミングを模倣でき、構造体に関連付けられた関数は、他のプログラミング言語におけるメソッドに相当します。</li>
|
||||
<li>Java と C# はオブジェクト指向のプログラミング言語であり、コードブロック(メソッド)は通常あるクラスの一部です。静的メソッドの振る舞いは関数に似ており、クラスに束縛され、特定のインスタンス変数にはアクセスできません。</li>
|
||||
<li>C++ と Python は、手続き型プログラミング(関数)にもオブジェクト指向プログラミング(メソッド)にも対応しています。</li>
|
||||
</ul>
|
||||
<p><strong>Q</strong>: 「空間計算量の一般的な種類」の図は、占有空間の絶対サイズを反映していますか?</p>
|
||||
<p>いいえ、図は空間計算量を示しており、これは増加傾向を反映するものであり、占有空間の絶対サイズではありません。</p>
|
||||
<p><span class="arithmatex">\(n = 8\)</span>を取ると、各曲線の値がその関数に対応していないことに気づくかもしれません。これは、各曲線に定数項が含まれているためで、値の範囲を視覚的に快適な範囲に圧縮することを意図しています。</p>
|
||||
<p>実際には、通常は各メソッドの「定数項」複雑度を知らないため、複雑度のみに基づいて<span class="arithmatex">\(n = 8\)</span>の最良ソリューションを選択することは一般的に不可能です。しかし、<span class="arithmatex">\(n = 8^5\)</span>の場合、増加傾向が支配的になるため、選択がはるかに容易になります。</p>
|
||||
<p><strong>Q</strong>:「一般的な空間計算量の種類」の図が表しているのは、使用空間の絶対量ですか?</p>
|
||||
<p>いいえ。この図が示しているのは空間計算量であり、表しているのは増加傾向であって、使用空間の絶対量ではありません。</p>
|
||||
<p><span class="arithmatex">\(n = 8\)</span> と仮定すると、各曲線の値が対応する関数と一致していないように見えるかもしれません。これは、各曲線に定数項が含まれており、値の範囲を視覚的に見やすい範囲へ圧縮しているためです。</p>
|
||||
<p>実際には、各手法の「定数項」の複雑度がどれほどか通常は分からないため、一般に複雑度だけを根拠に <span class="arithmatex">\(n = 8\)</span> 以下で最適解を選ぶことはできません。ただし、<span class="arithmatex">\(n = 8^5\)</span> であれば選びやすく、このときは増加傾向がすでに支配的になっています。</p>
|
||||
<p><strong>Q</strong> 実際の利用場面に応じて、時間(または空間)を犠牲にしてアルゴリズムを設計することはありますか?</p>
|
||||
<p>実際の応用では、多くの場合、空間を犠牲にして時間を得る選択をします。たとえばデータベースのインデックスでは、通常 B+ 木やハッシュインデックスを構築し、大量のメモリ空間を使う代わりに、<span class="arithmatex">\(O(\log n)\)</span> あるいは <span class="arithmatex">\(O(1)\)</span> の高速な検索を実現します。</p>
|
||||
<p>空間資源が貴重な場面では、時間を犠牲にして空間を得ることもあります。たとえば組み込み開発では、デバイスのメモリが非常に貴重なため、エンジニアはハッシュテーブルの使用をやめ、配列による順次探索を選んでメモリ使用量を節約することがあります。その代償として探索は遅くなります。</p>
|
||||
|
||||
<!-- Source file information -->
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user