メモ化と tabulation の比較
部分問題の答えをキャッシュする 2 つの方法を学びます
「メモ化と tabulation の比較」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。
なぜキャッシュするのか
素朴な再帰では、同じ処理を何度も繰り返します。動的計画法では各答えを1回だけ保存するため、再計算せずに済みます。
fib(40) # slow: recomputes endlessly重複する部分問題
問題が重複する部分問題に分割されるとき、DPを適用できます。再帰の多くの分岐で、同じ小さなケースが現れます。
fib(5) needs fib(3) twiceトップダウン:メモ化
メモ化は、キャッシュを加えた通常の再帰です。必要になったときに計算し、各入力を初めて処理したときの結果を記憶します。
memo = {}Pythonで簡単にメモ化する
lru_cacheデコレーターを使うと、1行で遅い再帰を高速なDPに変えられます。すべての呼び出しが自動的にキャッシュされます。
from functools import lru_cache
@lru_cache(None)
def f(n): ...ボトムアップ:表計算
表計算では、最小のケースから答えに向かってテーブルを埋めます。再帰の代わりにループを使います。
dp = [0] * (n + 1)表計算によるフィボナッチ数列
基底値を設定し、各セルからすでに計算された値を参照します。コールスタックは不要で、すっきりしたループだけで済みます。
dp[0], dp[1] = 0, 1
for i in range(2, n+1):
dp[i] = dp[i-1] + dp[i-2]同じ答え、異なる方法
メモ化と表計算は同じ漸化式を解きます。違いは方向だけです。トップダウンで必要なときに計算するか、ボトムアップで順番に計算するかの違いです。
メモ化を選ぶ場面
漸化式を自然に書け、すべての状態を計算する必要がないかもしれない場合は、メモ化を選びます。
表計算を選ぶ場面
処理を高速なループにしたい場合、再帰制限エラーを避けたい場合、またはいずれにせよテーブル全体を計算する場合は表計算を選びます。
import sys; sys.setrecursionlimit(10**6)再帰制限に注意する
深いメモ化再帰では、Pythonの再帰制限に達し、大きな入力で実行時エラーになることがあります。
どちらにも共通するコスト
どちらの方法でも、高速化の理由は各状態を1回だけ解くことです。合計時間は、状態数と状態ごとの処理量の積になります。
確認問題
ループを使ってボトムアップにテーブルを埋める方法はどちらですか?
まとめ:2つの道、1つのDP
部分問題をキャッシュする方法は2つあります。メモ化はトップダウンで再帰し、表計算はボトムアップでループします。読みやすい方を選びます。✨
よくある質問
「メモ化と tabulation の比較」レッスンは無料ですか?
はい。「メモ化と tabulation の比較」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。
「メモ化と tabulation の比較」で何を学びますか?
部分問題の答えをキャッシュする 2 つの方法を学びます ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Competitive Programming Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「メモ化と tabulation の比較」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCompetitive Programming Academyレッスンでコードを書いて実行できますか?
はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メモ化と tabulation の比較
- 状態と遷移を定義する
- 階段登りとコインの組み合わせ
- 最長増加部分列