Combination Algorithm

バックトラッキングによる組み合わせ生成の完全解説

処理完了

アルゴリズム概要

組み合わせアルゴリズム(Combination Algorithm)は、与えられた範囲 [1, n] から k 個の要素を選ぶすべての組み合わせを生成するアルゴリズムです。 バックトラッキング手法を用いることで、効率的に全組み合わせを列挙できます。

主要な特徴

インタラクティブデモ

実行結果

結果がここに表示されます

ステップバイステップ解説

処理ステップ

1 初期化: result配列とpath配列を用意
2 開始: backtrack(1)を呼び出し
3 要素追加: pathに現在の数値を追加
4 判定: len(path) == k かチェック
5 結果追加: 条件満たす場合resultに追加
6 再帰呼び出し: 次の要素で再帰
7 バックトラック: pathから要素を削除

探索木の可視化

デモを実行して探索過程を確認してください

実装コード

from typing import List

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        """
        Return all possible combinations of k numbers out of range [1..n].

        Args:
            n (int): Upper bound of range (inclusive).
            k (int): Size of each combination.

        Returns:
            List[List[int]]: All combinations.

        Time Complexity: O(C(n, k))
        Space Complexity: O(k) for recursion depth
        """
        result: List[List[int]] = []
        path: List[int] = []

        def backtrack(start: int) -> None:
            # ベースケース: 目標サイズに到達
            if len(path) == k:
                result.append(path.copy())
                return

            # 現在の開始位置から n まで試行
            for i in range(start, n + 1):
                path.append(i)           # 選択
                backtrack(i + 1)         # 再帰
                path.pop()               # バックトラック

        backtrack(1)
        return result

# 使用例
solution = Solution()
result = solution.combine(4, 2)
print(f"C(4,2) = {result}")
# Output: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

計算量解析

O(C(n,k))
時間計算量
O(k)
空間計算量
C(n,k)
出力サイズ

詳細説明

時間計算量 O(C(n,k)): 生成される組み合わせの数に比例します。 各組み合わせの生成に O(k) 時間かかるため、全体では O(k × C(n,k)) となりますが、 通常は O(C(n,k)) で表現されます。

空間計算量 O(k): 再帰スタックの深さが最大 k であり、 path 配列も最大 k 要素を保持するため、O(k) の空間を使用します。

アルゴリズムフローチャート

📌 Start: backtrack(1, path=[])
🔍 Check: len(path) == k?
↙ Yes ↓ No
✅ Add to result
🔄 Loop i=start to n
🔙 Return
➕ path.append(i)
🔄 backtrack(i+1)
➖ path.pop() (Backtrack)