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>1.1 アルゴリズムは至るにある - Hello アルゴリズム</title>
<title>1.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">
1.1 &nbsp; アルゴリズムは至るにある
1.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>
@@ -629,7 +629,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
@@ -658,7 +658,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -795,7 +795,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -1072,7 +1072,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1100,7 +1100,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1603,7 +1603,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1625,7 +1625,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1647,7 +1647,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -1954,7 +1954,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2117,7 +2117,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2503,7 +2503,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2559,7 +2559,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2587,7 +2587,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3125,7 +3125,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3181,7 +3181,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3209,7 +3209,7 @@
<span class="md-ellipsis">
12.4 &nbsp; ハノイの塔問題
12.4 &nbsp; ハノイの塔問題
@@ -3402,7 +3402,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分集合和問題
13.3 &nbsp; 部分和問題
@@ -3430,7 +3430,7 @@
<span class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
@@ -3571,7 +3571,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法の初歩
14.1 &nbsp; 動的計画法入門
@@ -3599,7 +3599,7 @@
<span class="md-ellipsis">
14.2 &nbsp; DP 問題特性
14.2 &nbsp; 動的計画法の問題特性
@@ -3627,7 +3627,7 @@
<span class="md-ellipsis">
14.3 &nbsp; DP の解法の考え方
14.3 &nbsp; 動的計画法の問題解決の考え方
@@ -3655,7 +3655,7 @@
<span class="md-ellipsis">
14.4 &nbsp; 0-1ナップサック問題
14.4 &nbsp; 0-1 ナップサック問題
@@ -3848,7 +3848,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲アルゴリズム
15.1 &nbsp; 貪欲
@@ -4093,7 +4093,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に作に参加する
16.2 &nbsp; 一緒に作に参加しましょう
@@ -4264,63 +4264,63 @@
<!-- Page content -->
<h1 id="11">1.1 &nbsp; アルゴリズムは至るにある<a class="headerlink" href="#11" title="Permanent link">&para;</a></h1>
<p>「アルゴリズム」という言葉を聞くと、自然に数学を思い浮かべます。しかし、多くのアルゴリズムは複雑な数学を含まず、基本的な論理により多く依存しており、これは私たちの日常生活の至る所で見ることができます。</p>
<p>アルゴリズムについて正式に議論を始める前に、興味深い事実を共有する価値があります。<strong>あなたは無意識のうちに多くのアルゴリズムを学び、日常生活でそれらを応用することに慣れてい</strong>ここで、この点を証明するためにいくつかの具体的な例を挙げます。</p>
<p><strong>例1:辞書の引き方</strong>英語の辞書では、単語がアルファベット順に並んでいます。<span class="arithmatex">\(r\)</span>で始まる単語を探していると仮定すると、通常は以下の方法で行います</p>
<h1 id="11">1.1 &nbsp; アルゴリズムは至るところにある<a class="headerlink" href="#11" title="Permanent link">&para;</a></h1>
<p>「アルゴリズム」という言葉を聞くと、自然に数学を思い浮かべます。しかし実際には、多くのアルゴリズムは複雑な数学を必要とせず、むしろ基本的な論理に依存しており、その論理は私たちの日常生活のいたるところで見られます。</p>
<p>アルゴリズムを本格的に議論する前に、ひとつ面白い事実を共有しておきます。<strong>あなたはすでに知らず知らずのうちに多くのアルゴリズムを身につけ、それらを日常生活に応用することに慣れているので</strong>以下では、いくつかの具体例を挙げてこれを示します。</p>
<p><strong>例1:辞書を引く</strong>。辞書では、各漢字に対応するピンインがあり、辞書はピンインのアルファベット順に並んでいます。ピンインの先頭文字が <span class="arithmatex">\(r\)</span> の字を探すと仮定すると、通常は次の図のような方法で行います</p>
<ol>
<li>辞書を大体半分ぐらいのところで開き、そのページの最初の語彙を確認します。例えば<span class="arithmatex">\(m\)</span>で始まる文字だとしましょう</li>
<li><span class="arithmatex">\(r\)</span>はアルファベットで<span class="arithmatex">\(m\)</span>の後に来るので、前半を無視して、探索空間を後半に絞ります。</li>
<li><span class="arithmatex">\(r\)</span>で始まる単語を見つけるまで、ステップ<code>1.</code><code>2.</code>を繰り返します。</li>
<li>辞書をおよそ半分のところで開き、そのページの先頭文字を確認し、先頭文字が <span class="arithmatex">\(m\)</span> だとしま</li>
<li>ピンインのアルファベット表では <span class="arithmatex">\(r\)</span><span class="arithmatex">\(m\)</span> の後にあるため、辞書の前半を除外し、探索範囲を後半に絞ります。</li>
<li>ピンインの先頭文字が <span class="arithmatex">\(r\)</span> のページを見つけるまで、手順 <code>1.</code> と手順 <code>2.</code> を繰り返します。</li>
</ol>
<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">&lt;1&gt;</label><label for="__tabbed_1_2">&lt;2&gt;</label><label for="__tabbed_1_3">&lt;3&gt;</label><label for="__tabbed_1_4">&lt;4&gt;</label><label for="__tabbed_1_5">&lt;5&gt;</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p><img alt="辞書を引く過程" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step1.png" /></p>
<p><img alt="辞書を引く手順" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step1.png" /></p>
</div>
<div class="tabbed-block">
<p><img alt="辞書での二分探索ステップ2" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step2.png" /></p>
<p><img alt="binary_search_dictionary_step2" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step2.png" /></p>
</div>
<div class="tabbed-block">
<p><img alt="辞書での二分探索ステップ3" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step3.png" /></p>
<p><img alt="binary_search_dictionary_step3" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step3.png" /></p>
</div>
<div class="tabbed-block">
<p><img alt="辞書での二分探索ステップ4" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step4.png" /></p>
<p><img alt="binary_search_dictionary_step4" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step4.png" /></p>
</div>
<div class="tabbed-block">
<p><img alt="辞書での二分探索ステップ5" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step5.png" /></p>
<p><img alt="binary_search_dictionary_step5" class="animation-figure" src="../algorithms_are_everywhere.assets/binary_search_dictionary_step5.png" /></p>
</div>
</div>
</div>
<p align="center"> 図 1-1 &nbsp; 辞書を引く過程 </p>
<p align="center"> 図 1-1 &nbsp; 辞書を引く手順 </p>
<p>辞書を引くことは、小学生にとって必須スキルですが、実際には有名な「二分探索」アルゴリズムです。データ構造の観点から、辞書をソートされた「配列」と考えることができます。アルゴリズムの観点から、辞書で単語を探すために取られる一連の行動は、「二分探索」アルゴリズムと見なすことができます。</p>
<p><strong>例2:トランプ整理</strong>トランプをプレイするとき、手札を昇順に並べる必要があります。以下の過程で示されます。</p>
<p>辞書を引くという小学生の必須スキルは、実は有名な「二分探索」アルゴリズムそのものです。データ構造の観点では、辞書を整列済みの「配列」とみなせます。アルゴリズムの観点では、上記の一連の辞書引きの操作を「二分探索」とみなせます。</p>
<p><strong>例2:トランプ整理する</strong>カードゲームをするとき、毎回手札のトランプを小さい順に並べ替える必要があります。その流れは次の図のとおりです。</p>
<ol>
<li>トランプを「整列済み」と「未整列」のセクションに分けます。最初は一番左のカードが既に整列していると仮定します。</li>
<li>未整列セクションからカードを1枚取り出し、整列済みセクションの正しい位置に挿入します。この後、左端の2枚のカードが整列します。</li>
<li>すべてのカードが整列するまで、ステップ<code>2</code>を繰り返します。</li>
<li>トランプを「整列済み」と「未整列」の2つの部分に分け、初期状態では一番左の1枚がすでに整列済みだとします。</li>
<li>未整列部分から1枚のトランプを取り出し、整列済み部分の正しい位置に挿入します。完了すると、左端の2枚は整列済みになります。</li>
<li>手順 <code>2.</code> を繰り返し、各ラウンドで未整列部分から1枚を整列済み部分へ挿入し、すべてのトランプが整列済みになるまで続けます。</li>
</ol>
<p><img alt="トランプの整理過程" class="animation-figure" src="../algorithms_are_everywhere.assets/playing_cards_sorting.png" /></p>
<p align="center"> 図 1-2 &nbsp; トランプの整理過程 </p>
<p><img alt="トランプを並べ替える手順" class="animation-figure" src="../algorithms_are_everywhere.assets/playing_cards_sorting.png" /></p>
<p align="center"> 図 1-2 &nbsp; トランプを並べ替える手順 </p>
<p>上記のトランプ整理する方法は、質的に「挿入ソート」アルゴリズムであり、小さなデータセットに対して非常に効率的です。多くのプログラミング言語のソート関数に挿入ソートが含まれています。</p>
<p><strong>例3:お釣りの計算</strong>。スーパーマーケット<span class="arithmatex">\(69\)</span>の買い物をしたと仮定します。レジ係に<span class="arithmatex">\(100\)</span>を渡すと、<span class="arithmatex">\(31\)</span>のお釣りを提供する必要があります。この過程は以下の図で明確に理解できます。</p>
<p>上記のトランプ整理方法は、質的に「挿入ソート」アルゴリズムです。これは小規模なデータ集合を処理する際に非常に効率的で多くのプログラミング言語のソートライブラリ関数に挿入ソートが使われています。</p>
<p><strong>例3:お釣りを出す</strong>。スーパーで <span class="arithmatex">\(69\)</span> 元の商品を購入し、店員に <span class="arithmatex">\(100\)</span> 元渡したとすると、店員は <span class="arithmatex">\(31\)</span>のお釣りを返す必要があります。店員は自然に次の図のような考え方をします。</p>
<ol>
<li>選択肢は<span class="arithmatex">\(31\)</span>以下の価値のある通貨で、<span class="arithmatex">\(1\)</span><span class="arithmatex">\(5\)</span><span class="arithmatex">\(10\)</span><span class="arithmatex">\(20\)</span>が含まれます。</li>
<li>選択肢から最大の<span class="arithmatex">\(20\)</span>を取り出し、<span class="arithmatex">\(31 - 20 = 11\)</span>が残ります。</li>
<li>残りの選択肢から最大の<span class="arithmatex">\(10\)</span>を取り出し、<span class="arithmatex">\(11 - 10 = 1\)</span>が残ります。</li>
<li>残りの選択肢から最大の<span class="arithmatex">\(1\)</span>を取り出し、<span class="arithmatex">\(1 - 1 = 0\)</span>が残ります。</li>
<li>お釣りの計算が完了し、解答は<span class="arithmatex">\(20 + 10 + 1 = 31\)</span>です。</li>
<li>選択肢は <span class="arithmatex">\(31\)</span> 元より小さい額面の貨幣で、<span class="arithmatex">\(1\)</span><span class="arithmatex">\(5\)</span><span class="arithmatex">\(10\)</span><span class="arithmatex">\(20\)</span> 元があります。</li>
<li>選択肢の中から最大の <span class="arithmatex">\(20\)</span>を取り出すと、残りは <span class="arithmatex">\(31 - 20 = 11\)</span> 元です。</li>
<li>残りの選択肢の中から最大の <span class="arithmatex">\(10\)</span>を取り出すと、残りは <span class="arithmatex">\(11 - 10 = 1\)</span> 元です。</li>
<li>残りの選択肢の中から最大の <span class="arithmatex">\(1\)</span>を取り出すと、残りは <span class="arithmatex">\(1 - 1 = 0\)</span> 元です。</li>
<li>お釣りは完了し、内訳は <span class="arithmatex">\(20 + 10 + 1 = 31\)</span>です。</li>
</ol>
<p><img alt="お釣りの計算過程" class="animation-figure" src="../algorithms_are_everywhere.assets/greedy_change.png" /></p>
<p align="center"> 図 1-3 &nbsp; お釣りの計算過程 </p>
<p><img alt="お釣りの過程" class="animation-figure" src="../algorithms_are_everywhere.assets/greedy_change.png" /></p>
<p align="center"> 図 1-3 &nbsp; お釣りの過程 </p>
<p>記述されたステップでは、利用可能な最大の額面を使用して各段階で最良の選択肢を選ぶことで、効果的なお釣り計算戦略につながります。データ構造とアルゴリズムの観点から、このアプローチは「貪欲」アルゴリズムとして知られています。</p>
<p>料理の準備から宇宙旅行まで、ほぼすべての問題解決にアルゴリズムが関わっています。コンピュータの出現により、メモリにデータ構造を格納し、CPUとGPUを呼び出してアルゴリズムを実行するコードを書くことができるようになりました。このようにして、現実世界の問題をコンピュータに移し、より効率的な方法でさまざまな複雑な問題を解決できす。</p>
<p>以上の手順では、各ステップでその時点で最善と思われる選択肢を取っています。つまり、できるだけ額面の大きい貨幣を使い、最終的に実行可能なお釣りの方案を得ています。データ構造とアルゴリズムの観点から見ると、この方法は本質的に「貪欲法」です。</p>
<p>料理を一品作ることから星間航行に至るまで、ほとんどあらゆる問題解決にアルゴリズムは欠かせません。コンピュータの登場によって、プログラミングを通じてデータ構造をメモリに格納し、さらにコードを書いて CPU や GPU にアルゴリズムを実行させることが可能になりました。こうして、生活の中の問題をコンピュータに移し、より効率的な方法でさまざまな複雑な問題を解決できるのです。</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>データ構造、アルゴリズム、配列、二分探索などの概念についてまだ混乱している場合は、読み続けることをお勧めします。この本は、データ構造とアルゴリズムの理解の領域へと優しく導いてくれるでしょう</p>
<p>データ構造、アルゴリズム、配列、二分探索といった概念がまだ少し曖昧でも、そのまま読み進めてください。本書がデータ構造とアルゴリズムの知識の世界へと案内します</p>
</div>
<!-- Source file information -->
@@ -4344,7 +4344,7 @@ aria-label="フッター"
<a
href="../"
class="md-footer__link md-footer__link--prev"
aria-label="前: 第 1 章 &amp;nbsp; アルゴリズムとの出会い"
aria-label="前: 第 1 章 &amp;nbsp; アルゴリズム入門"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4356,7 +4356,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
第 1 章 &nbsp; アルゴリズムとの出会い
第 1 章 &nbsp; アルゴリズム入門
</div>
</div>
</a>
@@ -4368,7 +4368,7 @@ aria-label="フッター"
<a
href="../what_is_dsa/"
class="md-footer__link md-footer__link--next"
aria-label="次: 1.2 &amp;nbsp; アルゴリズムとは何か"
aria-label="次: 1.2 &amp;nbsp; アルゴリズムとは"
rel="next"
>
<div class="md-footer__title">
@@ -4376,7 +4376,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
</div>
</div>
<div class="md-footer__button md-icon">
+38 -38
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">
@@ -39,7 +39,7 @@
<title>第 1 章 アルゴリズムとの出会い - Hello アルゴリズム</title>
<title>第 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">
第 1 章 &nbsp; アルゴリズムとの出会い
第 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>
@@ -620,7 +620,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
@@ -648,7 +648,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -785,7 +785,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -1062,7 +1062,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1090,7 +1090,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1593,7 +1593,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1615,7 +1615,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1637,7 +1637,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -1944,7 +1944,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2107,7 +2107,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2493,7 +2493,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2549,7 +2549,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2577,7 +2577,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3115,7 +3115,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3171,7 +3171,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3199,7 +3199,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 クイーン問題
@@ -3561,7 +3561,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法の初歩
14.1 &nbsp; 動的計画法入門
@@ -3589,7 +3589,7 @@
<span class="md-ellipsis">
14.2 &nbsp; DP 問題特性
14.2 &nbsp; 動的計画法の問題特性
@@ -3617,7 +3617,7 @@
<span class="md-ellipsis">
14.3 &nbsp; DP の解法の考え方
14.3 &nbsp; 動的計画法の問題解決の考え方
@@ -3645,7 +3645,7 @@
<span class="md-ellipsis">
14.4 &nbsp; 0-1ナップサック問題
14.4 &nbsp; 0-1 ナップサック問題
@@ -3838,7 +3838,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲アルゴリズム
15.1 &nbsp; 貪欲
@@ -4083,7 +4083,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に作に参加する
16.2 &nbsp; 一緒に作に参加しましょう
@@ -4273,17 +4273,17 @@
<!-- Page content -->
<h1 id="1">第 1 章 &nbsp; アルゴリズムとの出会い<a class="headerlink" href="#1" title="Permanent link">&para;</a></h1>
<p><img alt="アルゴリズムとの出会い" class="cover-image" src="../assets/covers/chapter_introduction.jpg" /></p>
<h1 id="1">第 1 章 &nbsp; アルゴリズム入門<a class="headerlink" href="#1" title="Permanent link">&para;</a></h1>
<p><img alt="アルゴリズム入門" class="cover-image" src="../assets/covers/chapter_introduction.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">&para;</a></h2>
<ul>
<li><a href="algorithms_are_everywhere/">1.1 &nbsp; アルゴリズムはどこにでもある</a></li>
<li><a href="what_is_dsa/">1.2 &nbsp; アルゴリズムとは何か</a></li>
<li><a href="algorithms_are_everywhere/">1.1 &nbsp; アルゴリズムは至るところにある</a></li>
<li><a href="what_is_dsa/">1.2 &nbsp; アルゴリズムとは</a></li>
<li><a href="summary/">1.3 &nbsp; まとめ</a></li>
</ul>
@@ -4332,7 +4332,7 @@ aria-label="フッター"
<a
href="./algorithms_are_everywhere/"
class="md-footer__link md-footer__link--next"
aria-label="次: 1.1 &amp;nbsp; アルゴリズムはどこにでもある"
aria-label="次: 1.1 &amp;nbsp; アルゴリズムは至るところにある"
rel="next"
>
<div class="md-footer__title">
@@ -4340,7 +4340,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
</div>
</div>
<div class="md-footer__button md-icon">
+73 -50
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>
@@ -620,7 +620,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
@@ -648,7 +648,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -730,10 +730,21 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1-q-a" class="md-nav__link">
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
1. &nbsp; Q &amp; A
1. &nbsp; 要点の振り返り
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-q-a" class="md-nav__link">
<span class="md-ellipsis">
2. &nbsp; Q &amp; A
</span>
</a>
@@ -844,7 +855,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -1121,7 +1132,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1149,7 +1160,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1652,7 +1663,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1674,7 +1685,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1696,7 +1707,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -2003,7 +2014,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2166,7 +2177,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2552,7 +2563,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2608,7 +2619,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2636,7 +2647,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3174,7 +3185,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3230,7 +3241,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3258,7 +3269,7 @@
<span class="md-ellipsis">
12.4 &nbsp; ハノイの塔問題
12.4 &nbsp; ハノイの塔問題
@@ -3451,7 +3462,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分集合和問題
13.3 &nbsp; 部分和問題
@@ -3479,7 +3490,7 @@
<span class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
@@ -3620,7 +3631,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法の初歩
14.1 &nbsp; 動的計画法入門
@@ -3648,7 +3659,7 @@
<span class="md-ellipsis">
14.2 &nbsp; DP 問題特性
14.2 &nbsp; 動的計画法の問題特性
@@ -3676,7 +3687,7 @@
<span class="md-ellipsis">
14.3 &nbsp; DP の解法の考え方
14.3 &nbsp; 動的計画法の問題解決の考え方
@@ -3704,7 +3715,7 @@
<span class="md-ellipsis">
14.4 &nbsp; 0-1ナップサック問題
14.4 &nbsp; 0-1 ナップサック問題
@@ -3897,7 +3908,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲アルゴリズム
15.1 &nbsp; 貪欲
@@ -4142,7 +4153,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に作に参加する
16.2 &nbsp; 一緒に作に参加しましょう
@@ -4285,10 +4296,21 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1-q-a" class="md-nav__link">
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
1. &nbsp; Q &amp; A
1. &nbsp; 要点の振り返り
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-q-a" class="md-nav__link">
<span class="md-ellipsis">
2. &nbsp; Q &amp; A
</span>
</a>
@@ -4333,24 +4355,25 @@
<!-- Page content -->
<h1 id="13">1.3 &nbsp; まとめ<a class="headerlink" href="#13" title="Permanent link">&para;</a></h1>
<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>辞書を引く原理は二分探索アルゴリズムと一致しています。二分探索アルゴリズムは分割統治という重要なアルゴリズム思想を体現しています。</li>
<li>トランプを整理する過程は挿入ソートアルゴリズムと非常によく似ています。挿入ソートアルゴリズムは小規模なデータ集合のソートに適しています。</li>
<li>貨幣の釣り銭を求める手順の本質は貪欲アルゴリズムであり、各ステップでその時点で最善と思われる選択を取ります。</li>
<li>アルゴリズムとは、限られた時間内特定の問題を解決するための一連の命令または操作手順であり、データ構造とは、コンピュータでデータ組織し保存する方法です。</li>
<li>データ構造とアルゴリズムは密接に結びついています。データ構造はアルゴリズムの土台であり、アルゴリズムはデータ構造に生命を吹き込みます。</li>
<li>データ構造とアルゴリズムは積み木の組み立てにたとえることができます。積み木はデータを表し、積み木の形や接続方法などはデータ構造を表し、積み木を組み立てる手順がアルゴリズムに対応します。</li>
</ul>
<h3 id="1-q-a">1. &nbsp; Q &amp; A<a class="headerlink" href="#1-q-a" title="Permanent link">&para;</a></h3>
<p><strong>Q</strong>:プログラマーとして、日常の仕事でアルゴリズムを手動で実装する必要があることはめったにありません。最も一般的に使用されるアルゴリズムは、既にプログラミング言語とライブラリに組み込まれており、すぐに使用できます。これは、私たちが仕事で遭遇する問題が、カスタムアルゴリズム設計を必要とする複雑さのレベルにまだ達していないことを示唆していますか?</p>
<p>特定の仕事スキル武術の「技」のようなものだとすれば、基礎科目は「内功」のようなものです。</p>
<p>アルゴリズム(およびその他の基礎科目)を学ぶ意義は、必ずしも仕事でそれらを一から実装することではなく、概念の確固たる理解に基づいて、より専門的な意思決定と問題解決を可能にし、それによって仕事全体的な質を向上させることだと私は信じています。例えば、すべてのプログラミング言語には組み込みのソート関数があります</p>
<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>私は、アルゴリズム(およびその他の基礎科目)を学ぶ意義は、仕事でそれをゼロから実装することではなく、学んだ知識に基づいて問題解決の際に専門的な反応や判断を下せるようになり、その結果として仕事全体の品質を高めることにあると考えています。簡単な例を挙げると、どのプログラミング言語にもソート関数が組み込まれています</p>
<ul>
<li>データ構造とアルゴリズムを学んでいない場合、どんなデータが与えられても、のソート関数に渡すだけかもしれません。スムーズに動作し、良いパフォーマンスを示し、問題がないように見えます</li>
<li>しかしアルゴリズムを学んだことがあれば、組み込みのソート関数の時間複雑度は通常<span class="arithmatex">\(O(n \log n)\)</span>であることを理解しています。さらに、データが固定桁数の整数(学生IDなど)で構成されている場合、基数ソートのようなより効率的なアプローチを適用でき、時間複雑度をO(nk)に削減できます。ここでkは桁数です。大量のデータを処理する際、節約された時間は重要な価値に変わります — コスト削減、ユーザーエクスペリエンスの向上、システムパフォーマンスの向上</li>
<li>もしデータ構造とアルゴリズムを学んでいなければ、どんなデータが与えられても、のソート関数に任せてしまうかもしれません。問題なく動き、性能も悪くなく、一見すると特に問題はありません</li>
<li>しかしアルゴリズムを学んでいれば、組み込みのソート関数の時間計算量が <span class="arithmatex">\(O(n \log n)\)</span> であることを知っています。さらに、与えられたデータが固定桁数の整数(例えば学籍番号)であれば、より効率の高い「基数ソート」を使って、時間計算量を <span class="arithmatex">\(O(nk)\)</span> に下げることができます。ここで <span class="arithmatex">\(k\)</span> は桁数です。データ量が非常に大きい場合、節約できた実行時間は大きな価値を生みます(コスト削減、体験向上など)</li>
</ul>
<p>エンジニアリングでは、多くの問題最適に解決することは困難です。ほとんどは「準最適」解決策で対処されます。問題の難しさは、その固有の複雑さだけでなく、それに取り組む人の知識と経験にも依存します。専門知識と経験が深いほど、分析より徹底的になり、問題より優雅に解決できます。</p>
<p>工学分野では、多くの問題最適解に到達することは難しく、少なくない問題は「だいたい」解決されているにすぎません。問題の難しさは、一方では問題そのものの性質に依存し、他方ではそれを観測する人の知識の蓄積にも依存します。知識が充実し、経験が豊富であるほど、問題分析より深くなり、問題より洗練された形で解決できるようになります。</p>
<!-- Source file information -->
@@ -4373,7 +4396,7 @@ aria-label="フッター"
<a
href="../what_is_dsa/"
class="md-footer__link md-footer__link--prev"
aria-label="前: 1.2 &amp;nbsp; アルゴリズムとは何か"
aria-label="前: 1.2 &amp;nbsp; アルゴリズムとは"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4385,7 +4408,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
</div>
</div>
</a>
@@ -4397,7 +4420,7 @@ aria-label="フッター"
<a
href="../../chapter_computational_complexity/"
class="md-footer__link md-footer__link--next"
aria-label="次: 第 2 章 &amp;nbsp; 複雑度解析"
aria-label="次: 第 2 章 &amp;nbsp; 計算量解析"
rel="next"
>
<div class="md-footer__title">
@@ -4405,7 +4428,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
第 2 章 &nbsp; 複雑度解析
第 2 章 &nbsp; 計算量解析
</div>
</div>
<div class="md-footer__button md-icon">
+62 -62
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">
@@ -39,7 +39,7 @@
<title>1.2 アルゴリズムとは何か - Hello アルゴリズム</title>
<title>1.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">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
</span>
</div>
@@ -341,7 +341,7 @@
<span class="md-ellipsis">
はじめに
@@ -358,7 +358,7 @@
<span class="md-nav__icon md-icon"></span>
はじめに
</label>
@@ -620,7 +620,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
@@ -657,7 +657,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -675,7 +675,7 @@
<span class="md-ellipsis">
1.2 &nbsp; アルゴリズムとは何か
1.2 &nbsp; アルゴリズムとは
@@ -866,7 +866,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率評価
2.1 &nbsp; アルゴリズム効率評価
@@ -1143,7 +1143,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値の符号化 *
3.3 &nbsp; 数値エンコーディング *
@@ -1171,7 +1171,7 @@
<span class="md-ellipsis">
3.4 &nbsp; 文字の符号化 *
3.4 &nbsp; 文字エンコーディング *
@@ -1674,7 +1674,7 @@
<span class="md-ellipsis">
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
@@ -1696,7 +1696,7 @@
<span class="md-nav__icon md-icon"></span>
第 6 章 &nbsp; ハッシュ
第 6 章 &nbsp; ハッシュテーブル
</label>
@@ -1718,7 +1718,7 @@
<span class="md-ellipsis">
6.1 &nbsp; ハッシュ
6.1 &nbsp; ハッシュテーブル
@@ -2025,7 +2025,7 @@
<span class="md-ellipsis">
7.5 &nbsp; AVL木 *
7.5 &nbsp; AVL 木 *
@@ -2188,7 +2188,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築操作
8.2 &nbsp; ヒープ構築
@@ -2574,7 +2574,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入
10.2 &nbsp; 二分探索の挿入位置
@@ -2630,7 +2630,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュ最適化戦略
10.4 &nbsp; ハッシュによる最適化戦略
@@ -2658,7 +2658,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズムの再認識
10.5 &nbsp; 探索アルゴリズム再考
@@ -3196,7 +3196,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治アルゴリズム
12.1 &nbsp; 分割統治
@@ -3252,7 +3252,7 @@
<span class="md-ellipsis">
12.3 &nbsp; 木の構築問題
12.3 &nbsp; 二分木の構築問題
@@ -3280,7 +3280,7 @@
<span class="md-ellipsis">
12.4 &nbsp; ハノイの塔問題
12.4 &nbsp; ハノイの塔問題
@@ -3473,7 +3473,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分集合和問題
13.3 &nbsp; 部分和問題
@@ -3501,7 +3501,7 @@
<span class="md-ellipsis">
13.4 &nbsp; Nクイーン問題
13.4 &nbsp; n クイーン問題
@@ -3642,7 +3642,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法の初歩
14.1 &nbsp; 動的計画法入門
@@ -3670,7 +3670,7 @@
<span class="md-ellipsis">
14.2 &nbsp; DP 問題特性
14.2 &nbsp; 動的計画法の問題特性
@@ -3698,7 +3698,7 @@
<span class="md-ellipsis">
14.3 &nbsp; DP の解法の考え方
14.3 &nbsp; 動的計画法の問題解決の考え方
@@ -3726,7 +3726,7 @@
<span class="md-ellipsis">
14.4 &nbsp; 0-1ナップサック問題
14.4 &nbsp; 0-1 ナップサック問題
@@ -3919,7 +3919,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲アルゴリズム
15.1 &nbsp; 貪欲
@@ -4164,7 +4164,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に作に参加する
16.2 &nbsp; 一緒に作に参加しましょう
@@ -4376,75 +4376,75 @@
<!-- Page content -->
<h1 id="12">1.2 &nbsp; アルゴリズムとは何か<a class="headerlink" href="#12" title="Permanent link">&para;</a></h1>
<h1 id="12">1.2 &nbsp; アルゴリズムとは<a class="headerlink" href="#12" title="Permanent link">&para;</a></h1>
<h2 id="121">1.2.1 &nbsp; アルゴリズムの定義<a class="headerlink" href="#121" title="Permanent link">&para;</a></h2>
<p><u>アルゴリズム</u>は、限時間内特定の問題を解決するための一連の指示またはステップです。以下の特徴があります</p>
<p><u>アルゴリズムalgorithm</u>は、限られた時間内特定の問題を解決するための一連の命令または操作手順であり、次のような特徴を持ちます</p>
<ul>
<li>問題が明確に定義されており、入力と出力の明確な定義が含まれています。</li>
<li>アルゴリズムは実行可能で、有限の回数のステップ、時間、メモリ空間で完了できることを意味します。</li>
<li>ステップには明確な意味があります。同じ入力と条件の下で出力は一貫して同じです。</li>
<li>問題が明確であり、入力と出力の定義がはっきりしています。</li>
<li>実行可能であり、有限の手順、時間、メモリ空間で完了できます。</li>
<li>手順の意味が確定しており、同じ入力と実行条件では常に同じ出力になります。</li>
</ul>
<h2 id="122">1.2.2 &nbsp; データ構造の定義<a class="headerlink" href="#122" title="Permanent link">&para;</a></h2>
<p><u>データ構造</u>は、コンピュータ内でデータを組織し保存する方法で、以下の設計目標があります</p>
<p><u>データ構造data structure</u>は、データを整理して保存する方式であり、データの内容、データ間の関係、データの操作方法を含み、次のような設計目標があります</p>
<ul>
<li>コンピュータのメモリを節約するために空間占有を最小化する</li>
<li>データ操作を可能な限り高速にし、データのアクセス、追加、削除、更新などをカバーする</li>
<li>効率的なアルゴリズム実行を可能にするために、簡潔なデータ表現と論理情報を提供する</li>
<li>使用する空間をできるだけ少なくし、コンピュータのメモリを節約します</li>
<li>データ操作をできるだけ高速にし、アクセス、追加、削除、更新などを含みます</li>
<li>簡潔なデータ表現と論理情報を提供し、アルゴリズムが効率よく動作できるようにします</li>
</ul>
<p><strong>データ構造の設計はバランスを取る行為であり、しばしばトレードオフが必要です</strong>一つの側面を改善したい場合、しばしば別の面で妥協する必要があります。以下は2つの例です:</p>
<p><strong>データ構造の設計はトレードオフに満ちた過程です</strong>ある面を改善したい場合、別の面で妥協が必要になることがよくあります。以下に 2 つの例を示します。</p>
<ul>
<li>配列と比較して、連結リストはデータの追加削除においてより便利ですが、データアクセス速度を犠牲にします。</li>
<li>連結リストと比較して、グラフはより豊富な論理情報を提供しますが、より多くのメモリ空間必要す。</li>
<li>連結リストは配列に比べてデータの追加削除がしやすい一方で、データアクセス速度を犠牲にしています。</li>
<li>グラフは連結リストに比べてより豊富な論理情報を提供しますが、より大きなメモリ空間必要とします。</li>
</ul>
<h2 id="123">1.2.3 &nbsp; データ構造とアルゴリズムの関係<a class="headerlink" href="#123" title="Permanent link">&para;</a></h2>
<p>以下の図に示すように、データ構造とアルゴリズムは高度に関連し、密接に統合されており、具体的には以下の3つの側面があります</p>
<p>以下の図ように、データ構造とアルゴリズムは高度に関連し、密接に結び付いており、具体的には次の 3 つの点に表れます</p>
<ul>
<li>データ構造はアルゴリズムの基礎です。構造化されたデータ保存とアルゴリズムのためのデータ操作方法を提供します。</li>
<li>アルゴリズムはデータ構造に活力を注入します。データ構造だけではデータ情報を保存するだけです。アルゴリズムの応用によって、特定の問題を解決できます。</li>
<li>アルゴリズムは異なるデータ構造に基づいて実装できることが多いですが、実行効率大きく異なることがあります。適切なデータ構造を選択することがです。</li>
<li>データ構造はアルゴリズムの土台です。データ構造はアルゴリズムに対して、構造化して格納されたデータと、そのデータ操作する方法を提供します。</li>
<li>アルゴリズムはデータ構造に命を吹き込みます。データ構造そのものはデータ情報を保存するだけであり、アルゴリズムと組み合わせて初めて特定の問題を解決できます。</li>
<li>アルゴリズムは通常、異なるデータ構造に基づいて実装できすが、実行効率大きく異なる場合があり適切なデータ構造を選ことが重要です。</li>
</ul>
<p><img alt="データ構造とアルゴリズムの関係" class="animation-figure" src="../what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png" /></p>
<p align="center"> 図 1-4 &nbsp; データ構造とアルゴリズムの関係 </p>
<p>データ構造とアルゴリズムは、以下の図に示すように、ブロックのセットに例えることができます。ブロックセットには多数のピースが含まれ、詳細な組み立て説明書付いています。これらの説明書に段階的に従うことで、複雑なブロックモデルを構築できます。</p>
<p><img alt="ブロックの組み立て" class="animation-figure" src="../what_is_dsa.assets/assembling_blocks.png" /></p>
<p align="center"> 図 1-5 &nbsp; ブロックの組み立て </p>
<p>データ構造とアルゴリズムは、以下の図に示す組み立てブロックのようなものです。1 セットのブロックには多くの部品が含まれるだけでなく、詳しい組み立て説明書付いています。説明書に従って一歩ずつ操作すれば、精巧なブロック模型を組み立てられます。</p>
<p><img alt="組み立てブロック" class="animation-figure" src="../what_is_dsa.assets/assembling_blocks.png" /></p>
<p align="center"> 図 1-5 &nbsp; 組み立てブロック </p>
<p>両者の詳細な対応関係は以下の表に示されています。</p>
<p align="center"> 表 1-1 &nbsp; データ構造とアルゴリズムをブロックと比較 </p>
<p>両者の詳細な対応関係を次の表に示ます。</p>
<p align="center"> 表 1-1 &nbsp; データ構造とアルゴリズムを組み立てブロックにたとえる </p>
<div class="center-table">
<table>
<thead>
<tr>
<th>データ構造とアルゴリズム</th>
<th>ブロック</th>
<th>組み立てブロック</th>
</tr>
</thead>
<tbody>
<tr>
<td>入力データ</td>
<td>組み立てブロック</td>
<td>まだ組み立てていないブロック</td>
</tr>
<tr>
<td>データ構造</td>
<td>ブロックの組織、形状、サイズ、接続などを含む</td>
<td>ブロックの構成形式。形状、大きさ、接続方法などを含む</td>
</tr>
<tr>
<td>アルゴリズム</td>
<td>ブロックを望ましい形状に組み立てる一連のステップ</td>
<td>ブロックを目標の形に組み上げる一連の操作手順</td>
</tr>
<tr>
<td>出力データ</td>
<td>完成したブロックモデル</td>
<td>ブロック模型</td>
</tr>
</tbody>
</table>
</div>
<p>データ構造とアルゴリズムはプログラミング言語から独立していることは注目に値します。この理由により、この本は複数のプログラミング言語での実装を提供できます。</p>
<p>特筆すべき点として、データ構造とアルゴリズムはプログラミング言語から独立しています。だからこそ、本書では複数のプログラミング言語に基づく実装を提供できます。</p>
<div class="admonition tip">
<p class="admonition-title">慣習的な略</p>
<p>生活の議論では、「データ構造とアルゴリズム」を単純に「アルゴリズム」と呼ぶことがよくあります。例えば、よく知られたLeetCodeアルゴリズム問題は、実際にはデータ構造とアルゴリズムの両方の知識をテストしています。</p>
<p class="admonition-title">慣習的な略</p>
<p>の議論では、私たちは通常「データ構造とアルゴリズム」を略して「アルゴリズム」と呼びます。たとえば広く知られている LeetCodeアルゴリズム問題は、実際にはデータ構造とアルゴリズムの両方の知識を同時に問うています。</p>
</div>
<!-- Source file information -->
@@ -4468,7 +4468,7 @@ aria-label="フッター"
<a
href="../algorithms_are_everywhere/"
class="md-footer__link md-footer__link--prev"
aria-label="前: 1.1 &amp;nbsp; アルゴリズムはどこにでもある"
aria-label="前: 1.1 &amp;nbsp; アルゴリズムは至るところにある"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4480,7 +4480,7 @@ aria-label="フッター"
</span>
<div class="md-ellipsis">
1.1 &nbsp; アルゴリズムはどこにでもある
1.1 &nbsp; アルゴリズムは至るところにある
</div>
</div>
</a>