This commit is contained in:
krahets
2026-10-30 02:14:22 +08:00
parent a5ad0118bc
commit df28e1c562
1318 changed files with 33593 additions and 30289 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">
@@ -41,7 +41,7 @@
<title>14.7 まとめ - Hello アルゴリズム</title>
<title>14.7 まとめ - Hello Algo</title>
@@ -113,17 +113,6 @@
<div class="banner-svg">
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<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="/ja/chapter_appendix/contribution/">こちら</a> をご覧ください。</span>
</div>
</div>
</aside>
@@ -137,9 +126,9 @@
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="ヘッダー">
<a href="../.." title="Hello アルゴリズム" class="md-header__button md-logo" aria-label="Hello アルゴリズム" data-md-component="logo">
<a href="../.." title="Hello Algo" class="md-header__button md-logo" aria-label="Hello Algo" data-md-component="logo">
<img src="../../assets/images/logo.svg" alt="Hello アルゴリズム">
<img src="../../assets/images/logo.svg" alt="Hello Algo">
</a>
<label class="md-header__button md-icon" for="__drawer" aria-label="ナビゲーション">
@@ -150,7 +139,7 @@
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Hello アルゴリズム
Hello Algo
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
@@ -169,9 +158,9 @@
<input class="md-option" data-md-color-media="none" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="teal" aria-label="ダークモード" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="none" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="teal" aria-label="ダークモードに切り替える" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="ダークモード" for="__palette_1" hidden>
<label class="md-header__button md-icon" title="ダークモードに切り替える" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"/></svg>
</label>
@@ -179,9 +168,9 @@
<input class="md-option" data-md-color-media="none" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="teal" aria-label="ライトモード" type="radio" name="__palette" id="__palette_1">
<input class="md-option" data-md-color-media="none" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="teal" aria-label="ライトモードに切り替える" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="ライトモード" for="__palette_0" hidden>
<label class="md-header__button md-icon" title="ライトモードに切り替える" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"/></svg>
</label>
@@ -295,12 +284,12 @@
<nav class="md-nav md-nav--primary" aria-label="ナビゲーション" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Hello アルゴリズム" class="md-nav__button md-logo" aria-label="Hello アルゴリズム" data-md-component="logo">
<a href="../.." title="Hello Algo" class="md-nav__button md-logo" aria-label="Hello Algo" data-md-component="logo">
<img src="../../assets/images/logo.svg" alt="Hello アルゴリズム">
<img src="../../assets/images/logo.svg" alt="Hello Algo">
</a>
Hello アルゴリズム
Hello Algo
</label>
<div class="md-nav__source">
@@ -351,7 +340,7 @@
<span class="md-ellipsis">
はじめに
序文
</span>
@@ -367,7 +356,7 @@
<span class="md-nav__icon md-icon"></span>
はじめに
序文
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -421,7 +410,7 @@
<span class="md-ellipsis">
第 0 章 &nbsp; 前書き
第 0 章 &nbsp; はじめに
</span>
@@ -442,7 +431,7 @@
<span class="md-nav__icon md-icon"></span>
第 0 章 &nbsp; 前書き
第 0 章 &nbsp; はじめに
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -577,7 +566,7 @@
<span class="md-ellipsis">
第 1 章 &nbsp; アルゴリズムを知る
第 1 章 &nbsp; アルゴリズムとの出会い
</span>
@@ -598,7 +587,7 @@
<span class="md-nav__icon md-icon"></span>
第 1 章 &nbsp; アルゴリズムを知る
第 1 章 &nbsp; アルゴリズムとの出会い
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -619,7 +608,7 @@
<span class="md-ellipsis">
1.1 &nbsp; アルゴリズムは至るところにある
1.1 &nbsp; アルゴリズムはどこにでもある
</span>
@@ -739,7 +728,7 @@
<span class="md-ellipsis">
第 2 章 &nbsp; 計算量解析
第 2 章 &nbsp; 計算量の解析
</span>
@@ -760,7 +749,7 @@
<span class="md-nav__icon md-icon"></span>
第 2 章 &nbsp; 計算量解析
第 2 章 &nbsp; 計算量の解析
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -781,7 +770,7 @@
<span class="md-ellipsis">
2.1 &nbsp; アルゴリズム効率の評価
2.1 &nbsp; アルゴリズムの効率の評価
</span>
@@ -916,7 +905,7 @@
<span class="md-ellipsis">
2.6 &nbsp; 演習
2.6 &nbsp; 練習問題
</span>
@@ -1078,7 +1067,7 @@
<span class="md-ellipsis">
3.3 &nbsp; 数値エンコーディング *
3.3 &nbsp; 数値の符号化 *
</span>
@@ -1159,7 +1148,7 @@
<span class="md-ellipsis">
3.6 &nbsp; 演習
3.6 &nbsp; 練習問題
</span>
@@ -1402,7 +1391,7 @@
<span class="md-ellipsis">
4.6 &nbsp; 演習
4.6 &nbsp; 練習問題
</span>
@@ -1616,7 +1605,7 @@
<span class="md-ellipsis">
5.5 &nbsp; 演習
5.5 &nbsp; 練習問題
</span>
@@ -1830,7 +1819,7 @@
<span class="md-ellipsis">
6.5 &nbsp; 演習
6.5 &nbsp; 練習問題
</span>
@@ -2102,7 +2091,7 @@
<span class="md-ellipsis">
7.7 &nbsp; 演習
7.7 &nbsp; 練習問題
</span>
@@ -2235,7 +2224,7 @@
<span class="md-ellipsis">
8.2 &nbsp; ヒープ構築
8.2 &nbsp; ヒープの構築
</span>
@@ -2316,7 +2305,7 @@
<span class="md-ellipsis">
8.5 &nbsp; 演習
8.5 &nbsp; 練習問題
</span>
@@ -2530,7 +2519,7 @@
<span class="md-ellipsis">
9.5 &nbsp; 演習
9.5 &nbsp; 練習問題
</span>
@@ -2667,7 +2656,7 @@
<span class="md-ellipsis">
10.2 &nbsp; 二分探索の挿入位置
10.2 &nbsp; 二分探索で挿入位置を探す
</span>
@@ -2694,7 +2683,7 @@
<span class="md-ellipsis">
10.3 &nbsp; 二分探索の境界
10.3 &nbsp; 二分探索で境界を探す
</span>
@@ -2721,7 +2710,7 @@
<span class="md-ellipsis">
10.4 &nbsp; ハッシュによる最適化戦略
10.4 &nbsp; ハッシュを使った最適化
</span>
@@ -2748,7 +2737,7 @@
<span class="md-ellipsis">
10.5 &nbsp; 探索アルゴリズム再考
10.5 &nbsp; 探索アルゴリズムを改めて考える
</span>
@@ -2802,7 +2791,7 @@
<span class="md-ellipsis">
10.7 &nbsp; 演習
10.7 &nbsp; 練習問題
</span>
@@ -3138,7 +3127,7 @@
<span class="md-ellipsis">
11.9 &nbsp; 計数ソート
11.9 &nbsp; カウントソート
</span>
@@ -3219,7 +3208,7 @@
<span class="md-ellipsis">
11.12 &nbsp; 演習
11.12 &nbsp; 練習問題
</span>
@@ -3327,7 +3316,7 @@
<span class="md-ellipsis">
12.1 &nbsp; 分割統治法
12.1 &nbsp; 分割統治アルゴリズム
</span>
@@ -3354,7 +3343,7 @@
<span class="md-ellipsis">
12.2 &nbsp; 分割統治探索戦略
12.2 &nbsp; 分割統治による探索戦略
</span>
@@ -3462,7 +3451,7 @@
<span class="md-ellipsis">
12.6 &nbsp; 演習
12.6 &nbsp; 練習問題
</span>
@@ -3597,7 +3586,7 @@
<span class="md-ellipsis">
13.2 &nbsp; 全順列問題
13.2 &nbsp; 順列列挙問題
</span>
@@ -3624,7 +3613,7 @@
<span class="md-ellipsis">
13.3 &nbsp; 部分和問題
13.3 &nbsp; 部分集合和問題
</span>
@@ -3705,7 +3694,7 @@
<span class="md-ellipsis">
13.6 &nbsp; 演習
13.6 &nbsp; 練習問題
</span>
@@ -3819,7 +3808,7 @@
<span class="md-ellipsis">
14.1 &nbsp; 動的計画法入門
14.1 &nbsp; 動的計画法への第一歩
</span>
@@ -3846,7 +3835,7 @@
<span class="md-ellipsis">
14.2 &nbsp; 動的計画法の問題特性
14.2 &nbsp; 動的計画法の問題の特徴
</span>
@@ -3873,7 +3862,7 @@
<span class="md-ellipsis">
14.3 &nbsp; 動的計画法の問題解決の考え方
14.3 &nbsp; 動的計画法の解き方
</span>
@@ -3927,7 +3916,7 @@
<span class="md-ellipsis">
14.5 &nbsp; 完全ナップサック問題
14.5 &nbsp; 個数制限なしナップサック問題
</span>
@@ -4066,7 +4055,7 @@
<span class="md-ellipsis">
14.8 &nbsp; 演習
14.8 &nbsp; 練習問題
</span>
@@ -4174,7 +4163,7 @@
<span class="md-ellipsis">
15.1 &nbsp; 貪欲法
15.1 &nbsp; 貪欲アルゴリズム
</span>
@@ -4201,7 +4190,7 @@
<span class="md-ellipsis">
15.2 &nbsp; 分数ナップサック問題
15.2 &nbsp; 分割可能ナップサック問題
</span>
@@ -4255,7 +4244,7 @@
<span class="md-ellipsis">
15.4 &nbsp; 最大積分割問題
15.4 &nbsp; 整数を分割して積を最大にする問題
</span>
@@ -4309,7 +4298,7 @@
<span class="md-ellipsis">
15.6 &nbsp; 演習
15.6 &nbsp; 練習問題
</span>
@@ -4438,7 +4427,7 @@
<span class="md-ellipsis">
16.2 &nbsp; 一緒に制作に参加しましょう
16.2 &nbsp; 一緒に本書を作りましょう
</span>
@@ -4637,30 +4626,30 @@
<!-- Page content -->
<h1 id="147">14.7 &nbsp; まとめ<a class="headerlink" href="#147" title="Permanent link">&para;</a></h1>
<h3 id="1">1. &nbsp; 要点の振り返り<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<h1 id="147">14.7 &nbsp; まとめ<a class="headerlink" href="#147" title="この見出しへのリンク">&para;</a></h1>
<h3 id="1">1. &nbsp; 要点の振り返り<a class="headerlink" href="#1" title="この見出しへのリンク">&para;</a></h3>
<ul>
<li>動的計画法は問題を分解し、部分問題の解を保存することで重複計算を避け、計算効率を高めます。</li>
<li>時間を考慮しなければ、すべての動的計画法の問題はバックトラッキング(総当たり探索)で解けますが、再帰木には大量の重複部分問題が存在するため、効率はきわめて低くなります。メモ化配列を導入すると、計算済みのすべての部分問題の解を保存でき、重複部分問題が 1 回だけ計算されることを保証できます。</li>
<li>メモ化探索はトップダウンの再帰的解法であり、それに対応する動的計画法はボトムアップの漸化式による解法で、ちょうど「表を埋める」ようなものです。現在の状態は一部の局所状態にのみ依存するため、<span class="arithmatex">\(dp\)</span> 表の 1 次元を削減して空間計算量を下げることができます。</li>
<li>部分問題への分解は汎用的なアルゴリズムの考え方であり、分割統治、動的計画法、バックトラッキングではそれぞれ異なる性質を持ちます。</li>
<li>動的計画法の問題には 3 つの大きな特徴があります。重複部分問題、最適部分構造、無後効性です。</li>
<li>元の問題の最適解が部分問題の最適解から構築できるなら、その問題は最適部分構造を持ちます。</li>
<li>無後効性とは、ある状態の将来の発展がその状態のみに関係し、過去に経たすべての状態とは無関係であることを指します。多くの組合せ最適化問題は無後効性を持たず、動的計画法で高速に解くことはできません。</li>
<li>動的計画法は問題を分解し、部分問題の解を保存して重複計算を避け、計算効率を高めます。</li>
<li>時間を度外視すれば、動的計画法の問題はすべてバックトラッキング(全探索)で解けます。ただし、再帰木に大量の重複した部分問題が含まれ、非常に非効率です。記録用リストを導入して計算済みの解を保存すれば、重複する部分問題を 1 回だけ計算できます。</li>
<li>メモ化探索は上から下への再帰的な解法です。対応する動的計画法は下から上へ漸化式を適用する解法で、「表を埋める」ように進めます。現在の状態が一部の近隣の状態だけに依存するため、<span class="arithmatex">\(dp\)</span> テーブルの次元を一つ減らして空間計算量を下げられます。</li>
<li>部分問題への分解は汎用的なアルゴリズムの考え方ですが、分割統治、動的計画法、バックトラッキングでは性質が異なります。</li>
<li>動的計画法の問題には、部分問題の重複、最適部分構造、後続の判断が過去の経路に依存しない性質という 3 大特徴があります。</li>
<li>元の問題の最適解を部分問題の最適解から組み立てられるなら、最適部分構造があります。</li>
<li>後続の判断が過去の経路に依存しない性質とは、その後の展開が現在の状態だけで決まり、過去に通ったすべての状態には依存しないことです。多くの組合せ最適化問題はこの性質を持たず、動的計画法で高速に解くことはできません。</li>
</ul>
<p><strong>ナップサック問題</strong></p>
<ul>
<li>ナップサック問題は最も典型的な動的計画法の問題の 1 つであり、0-1 ナップサック、完全ナップサック、多重ナップサックなどの派生があります。</li>
<li>0-1 ナップサックの状態は、容量 <span class="arithmatex">\(c\)</span> のナップサックに対して、前 <span class="arithmatex">\(i\)</span> 個の品物で得られる最大価値として定義されます。ナップサックに入れない場合と入れる場合の 2 つの判断から最適部分構造を得て、状態遷移方程式を構築できます。空間最適化では、各状態が真上と左上の状態に依存するため、左上の状態が上書きされるのを避けるために配列を逆順に走査する必要があります。</li>
<li>完全ナップサック問題では各品物の選択数に制限がないため、品物を入れる場合の状態遷移は 0-1 ナップサック問題とは異なります。状態は真上と真左の状態に依存するので、空間最適化では順方向に走査するべきです。</li>
<li>コイン両替問題は完全ナップサック問題の変種です。「最大」価値を求める問題から「最小」の硬貨枚数を求める問題へ変わるため、状態遷移方程式の <span class="arithmatex">\(\max()\)</span> は <span class="arithmatex">\(\min()\)</span> に置き換える必要があります。また、ナップサック容量を「超えない」ことを目指すのではなく、目標金額を「ちょうど」作ることを目指すため、<span class="arithmatex">\(amt + 1\)</span> を「目標金額を作れない」無効解の表現として用います。</li>
<li>コイン両替問題 II では、「最少硬貨枚数」を求める問題から「硬貨の組合せ数」を求める問題へ変わるため、状態遷移方程式も <span class="arithmatex">\(\min()\)</span> から総和演算子へ対応して変わります。</li>
<li>ナップサック問題は動的計画法の最も典型的な問題の一つで、0-1、個数制限なし、個数制限付きなどの変種があります。</li>
<li>0-1 ナップサック問題では、最初の <span class="arithmatex">\(i\)</span> 個の品物から選んで容量 <span class="arithmatex">\(c\)</span> のナップサックに入れたときの最大価値を状態に対応させます。「入れない」「入れる」の二つの選択から最適部分構造と状態遷移式が得られます。各状態は真上と左上の状態に依存するため、空間最適化では逆順に走査し、左上の状態が上書きされるのを防ぎます。</li>
<li>個数制限なしナップサック問題では各品物を選ぶ個数に制限がないため、入れる場合の状態遷移が 0-1 の場合と異なります。状態が真上と真左に依存するので、空間最適化では順方向に走査します。</li>
<li>硬貨の両替問題は、個数制限なしナップサック問題の変種です。価値の「最大化」が硬貨の枚数の「最小化」に変わるため、状態遷移式の <span class="arithmatex">\(\max()\)</span> を <span class="arithmatex">\(\min()\)</span> に変えます。また、容量を「超えない」条件が目標金額に「ちょうど一致する」条件に変わるため、<span class="arithmatex">\(amt + 1\)</span> で「目標金額を作れない」という無効な解を表します。</li>
<li>硬貨の両替問題 II では、「硬貨の最小枚数」の代わりに「硬貨の組み合わせの数」を求めるため、状態遷移式も <span class="arithmatex">\(\min()\)</span> から和に変わります。</li>
</ul>
<p><strong>編集距離問題</strong></p>
<ul>
<li>編集距離(Levenshtein 距離)は 2 つの文字列間の類似度を測るために用いられ、ある文字列を別の文字列へ変換するための最小編集回数として定義されます。編集操作には追加、削除、置換が含まれます。</li>
<li>編集距離問題の状態は、<span class="arithmatex">\(s\)</span> の前 <span class="arithmatex">\(i\)</span> 文字を <span class="arithmatex">\(t\)</span> の前 <span class="arithmatex">\(j\)</span> 文字へ変更するのに必要な最小編集回数として定義されます。<span class="arithmatex">\(s[i-1] \ne t[j-1]\)</span> のときは、追加、削除、置換の 3 つの判断があり、それぞれに対応する残りの部分問題があります。これにより最適部分構造を見いだし、状態遷移方程式を構築できます。一方、<span class="arithmatex">\(s[i-1] = t[j-1]\)</span> のときは現在の文字を編集する必要はありません。</li>
<li>編集距離では、状態は真上、真左、左上の状態に依存します。そのため、空間最適化後は順方向でも逆方向でも正しく状態遷移できません。そこで、変数を 1 つ用いて左上の状態を一時保存し、完全ナップサック問題と等価な形へ変換することで、空間最適化後に順方向走査を行えるようにします。</li>
<li>編集距離(Levenshtein 距離)は二つの文字列の類似度を測るもので、一方をもう一方に変換するための最小編集回数と定義されます。編集操作には、挿入、削除、置換があります。</li>
<li>編集距離問題では、<span class="arithmatex">\(s\)</span> の先頭 <span class="arithmatex">\(i\)</span> 文字を <span class="arithmatex">\(t\)</span> の先頭 <span class="arithmatex">\(j\)</span> 文字に変換する最小編集回数を状態に対応させます。<span class="arithmatex">\(s[i-1] \ne t[j-1]\)</span> なら挿入・削除・置換の 3 通りの選択があり、それぞれに残る部分問題があります。そこから最適部分構造と状態遷移式を導けます。<span class="arithmatex">\(s[i-1] = t[j-1]\)</span> なら、その文字は編集不要です。</li>
<li>編集距離では状態が真上、真左、左上に依存するため、空間最適化後は順方向でも逆方向でも、そのままでは正しく遷移できません。左上の状態を変数に一時保存すれば、個数制限なしナップサック問題と同じ状況になり、空間最適化後も順方向に走査できます。</li>
</ul>
<!-- Source file information -->
@@ -4684,7 +4673,7 @@ aria-label="フッター"
<a
href="../edit_distance_problem/"
class="md-footer__link md-footer__link--prev"
aria-label="前: 14.6 &amp;nbsp; 編集距離問題"
aria-label="前: 14.6   編集距離問題"
rel="prev"
>
<div class="md-footer__button md-icon">
@@ -4708,7 +4697,7 @@ aria-label="フッター"
<a
href="../exercises/"
class="md-footer__link md-footer__link--next"
aria-label="次: 14.8 &amp;nbsp; 演習"
aria-label="次: 14.8   練習問題"
rel="next"
>
<div class="md-footer__title">
@@ -4716,7 +4705,7 @@ aria-label="フッター"
次
</span>
<div class="md-ellipsis">
14.8 &nbsp; 演習
14.8 &nbsp; 練習問題
</div>
</div>
<div class="md-footer__button md-icon">
@@ -4730,14 +4719,10 @@ aria-label="フッター"
<!-- Comment system -->
<!-- Check-in button above comments -->
<h5 align="center" id="__comments">ご意見、ご質問、ご提案があればぜひコメントしてください</h5>
<h5 align="center" id="__comments">コメント欄で、考えや質問、ご提案をお寄せください。</h5>
<!-- Insert generated snippet here -->
<script
@@ -4770,7 +4755,20 @@ aria-label="フッター"
/* Set palette on initial load */
giscus.setAttribute("data-theme", getGiscusTheme())
/* The Giscus client creates the iframe asynchronously with an English title. */
;(function() {
function labelCommentsFrame() {
var frame = document.querySelector("iframe.giscus-frame")
if (!frame) return false
frame.setAttribute("title", "コメント")
return true
}
if (labelCommentsFrame()) return
var observer = new MutationObserver(function() {
if (labelCommentsFrame()) observer.disconnect()
})
observer.observe(giscus.parentElement, { childList: true, subtree: true })
})()
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
@@ -4809,7 +4807,7 @@ aria-label="フッター"
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2026 krahets<br>The website content is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
Copyright &copy; 2026 krahets<br>このサイトのコンテンツのライセンス: <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
</div>
@@ -4869,7 +4867,7 @@ aria-label="フッター"
<script id="__config" type="application/json">{"annotate":null,"base":"../../","features":["content.action.edit","content.code.annotate","content.code.copy","content.tabs.link","content.tooltips","navigation.indexes","navigation.tracking","search.highlight","search.share","search.suggest","toc.follow"],"search":"../../assets/javascripts/workers/search.b6b7e04f.min.js","tags":null,"translations":{"clipboard.copied":"コピーしました","clipboard.copy":"クリップボードへコピー","search.result.more.one":"このページ内にもう1件見つかりました","search.result.more.other":"このページ内にあと#件見つかりました","search.result.none":"何も見つかりませんでした","search.result.one":"1件見つかりました","search.result.other":"#件見つかりました","search.result.placeholder":"検索キーワードを入力してください","search.result.term.missing":"検索に含まれない","select.version":"バージョン切り替え"},"version":null}</script>
<script src="../../assets/javascripts/bundle.e559d5b757c25f1f23bd887b700c56e3018b129d471c011292faeb47b8b74ce4.min.js"></script>
<script src="../../assets/javascripts/bundle.bbe737eb31084dfc2f0d91a916c44a189920caa85eb843c038b80c96c32c779e.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>