Re-translate the Japanese version (#1871)

* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
This commit is contained in:
Yudong Jin
2026-03-30 07:30:15 +08:00
committed by GitHub
parent fe6443235b
commit d7b2277d2b
1444 changed files with 83312 additions and 8363 deletions
@@ -1,44 +1,44 @@
# 分割統治索戦略
# 分割統治索戦略
私たちは検索アルゴリズムが主に2つのカテゴリに分類されることを学びました
私たちはすでに学んだように、探索アルゴリズムは大きく二つに分けられる
- **総当たり検索**:データ構造を走査することで実され、時間計算量は $O(n)$ で
- **適応索**独特なデータ組織形式や事前情報を利用し、時間計算量は $O(\log n)$ または $O(1)$ に達することができます
- **力ずく探索**:データ構造を走査することで実され、時間計算量は $O(n)$ である
- **適応的探索**固有のデータ構造や事前情報を利用し、時間計算量は $O(\log n)$ 、さらには $O(1)$ に達しうる
実際、**時間計算量が $O(\log n)$ の索アルゴリズムは通常分割統治戦略に基づいています**。えば二分探索や木などです
実際、**時間計算量が $O(\log n)$ の索アルゴリズムは通常分割統治戦略に基づいて実装される**。たとえば二分探索や木構造である
- 二分探索の各ステップは、問題(配列内でターゲット要素を索する)をより小さな問題(配列の半分でターゲット要素を索する)に分し、配列が空になるかターゲット要素が見つかるまで続けます
- 木は分割統治のアイデアを表現し、二分探索木、AVL木、ヒープなどのデータ構造では、様々な操作の時間計算量は $O(\log n)$ で
- 二分探索の各ステップは、問題(配列内で目標要素を索すること)を小さな問題(配列の半分で目標要素を索すること)に分し、この過程は配列が空になるか目標要素が見つかるまで続
-構造は分割統治の考え方を代表するものであり、二分探索木、AVL 木、ヒープなどのデータ構造では、さまざまな操作の時間計算量はいずれも $O(\log n)$ である
二分探索の分割統治戦略は以下の通りです
二分探索の分割統治戦略は以下のとおりである
- **問題を分割できる**:二分探索は元の問題(配列内での検索)を部分問題(配列の半分での検索)に再帰的に分割し、中間要素とターゲット要素を比較することで実現されます
- **部分問題は独立している**:二分探索では、各ラウンドで一つの部分問題を処理し、の部分問題影響されません
- **部分問題の解をマージする必要ない**:二分探索は特定の要素を見つけることを目的としているため、部分問題の解をマージする必要がありません。部分問題が解決されると、元の問題も解決されます
- **問題は分解できる**:二分探索は元の問題(配列内で探索すること)を部分問題(配列の半分で探索すること)へ再帰的に分解する。これは中央要素と目標要素を比較することで実現され
- **部分問題は独立している**:二分探索では、各ラウンドで一つの部分問題だけを処理し、ほかの部分問題影響を受けない
- **部分問題の解を統合する必要ない**:二分探索は特定の要素を探すことを目的としているため、部分問題の解を統合する必要がない。部分問題が解決されると、元の問題も同時に解決され
分割統治は検索効率を向上させることができます。なぜなら、総当たり検索はラウンドごとに1つの選択肢しか除できませんが、**分割統治は選択肢の半分を除できるからです**
分割統治が探索効率を高められる本質的な理由は、力ずく探索では各ラウンドで一つの候補しか除できないのに対し、**分割統治による探索では各ラウンドで候補の半分を除できる**からである
### 分割統治に基づく二分探索の実装
### 分割統治に基づく二分探索
前の章では、二分探索反復に基づいて実装されました。今度は、分割統治(再帰)に基づいて実装します
前の章では、二分探索を漸化式(反復に基づいて実装した。ここでは分割統治(再帰)に基づいてこれを実装する
!!! question
長さ $n$ の順序付けられた配列 `nums` が与えられ、すべての要素一意である場合、要素 `target`見つけてください
長さ $n$ の順配列 `nums` が与えられ、そのすべての要素一意である要素 `target`探索せよ
分割統治の観点から、索区間 $[i, j]$ に対応する部分問題を $f(i, j)$ と表します。
分割統治の観点から、索区間 $[i, j]$ に対応する部分問題を $f(i, j)$ とす。
元の問題 $f(0, n-1)$ から開始して、以下のステップで二分探索を実行します
元の問題 $f(0, n-1)$ を出発点として、次の手順で二分探索を行う
1. 索区間 $[i, j]$ の中点 $m$ を計算し、それを使用して検索区間の半分を除去します
2. 半分のサイズに縮小された部分問題を再帰的に解決します。これは $f(i, m-1)$ または $f(m+1, j)$ になる可能性があります
3. `target` が見つかるか区間が空になってリターンするまで、ステップ `1.``2.` を繰り返します。
1. 索区間 $[i, j]$ の中点 $m$ を計算し、それに基づいて探索区間の半分を除外する
2. 規模が半分に縮小された部分問題を再帰的に解く。候補は $f(i, m-1)$ または $f(m+1, j)$ である
3. `1.``2.` の手順を繰り返し、`target` が見つかるか区間が空になったら返す。
以下の図は、配列内で要素 $6$ を探す二分探索分割統治過程を示しています
の図は、配列内で要素 $6$ を二分探索する分割統治過程を示してい
![二分探索の分割統治過程](binary_search_recur.assets/binary_search_recur.png)
![二分探索の分割統治過程](binary_search_recur.assets/binary_search_recur.png)
実装コードでは、問題 $f(i, j)$ を解決するために再帰関数 `dfs()` を宣言します:
実装コードでは、再帰関数 `dfs()` を宣言して問題 $f(i, j)$ を解く。
```src
[file]{binary_search_recur}-[class]{}-[func]{binary_search}