0Pricing
Coding Interview Prep · レッスン

範囲更新の遅延伝播

範囲全体への更新を後回しにします

「範囲更新の遅延伝播」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。

区間更新の問題

「l から r までのすべての要素に 5 を加える」というクエリが来たらどうでしょうか。各葉に触れると更新1回あたり O(n) かかり、多数の区間更新には遅すぎます。😰

遅延の考え方

遅延伝播を使うと、ノードは保留中の変更を、すぐには子へ伝えずに覚えておけます。実際に子が必要になるまで処理を先送りする仕組みです。

保留中の処理用の第2配列

木と並べてlazy配列を保持します。lazy[node] には、そのノード全体の区間に適用されるものの、まだ下へ伝播していない更新を格納します。

lazy = [0] * (4 * n)

ノード全体に適用する

更新がノード全体を覆う場合は、格納された値を調整し、変更をlazyに積んでから終了します。下の階層へ進む必要はありません。

seg[node] += (r - l + 1) * val
lazy[node] += val

下へ進む前に伝播する

子を調べる前に、保留中の lazy の値を両方の子へpush downします。これにより、子を読み取る時点で常に正しい状態になります。

def push_down(node, l, r):
    if lazy[node]:
        apply(2*node, l, mid)
        apply(2*node+1, mid+1, r)
        lazy[node] = 0

ノードごとの3つのケース

各ノードで、クエリ区間は重ならない、完全に覆う、部分的に重なる、のいずれかです。それぞれ、スキップ、遅延適用、両方の区間への再帰を行います。

遅延更新も対数時間

区間更新では、完全に覆われたノードが早期終了するため、触れるノードは O(log n) 個だけです。これが遅延伝播を使う大きな利点です。⚡

クエリでもプッシュダウンする

区間クエリでも、再帰する前に必ずプッシュダウンして、子ノードの最新の値を読み取れるようにする必要があります。これを忘れるのは、遅延伝播でよくある典型的なバグです。

再帰後にプルアップする

子ノードを更新したら、子ノードの値から親ノードを再計算します。このプルアップにより、すべての内部ノードとその部分木の整合性が保たれます。

seg[node] = seg[2*node] + seg[2*node+1]

代入と加算

遅延伝播は多くの演算で使えますが、代入と加算では結合方法が異なります。実装する前に、保留中の2つの更新をどのように統合するか決めておきましょう。

遅延伝播を使うべき場面

遅延伝播を使うのは、本当に区間更新が必要な場合だけにしましょう。点更新だけなら、通常のセグメント木のほうが単純で十分です。

理解度チェック

ノードの子に再帰する前に、何を行う必要がありますか?

まとめ: 遅延更新

遅延伝播について学びました。保留中の変更を保存し、下へ進む前にプッシュダウンし、その後にプルアップすることで、O(log n) の区間更新を実現できます。🎉

よくある質問

「範囲更新の遅延伝播」レッスンは無料ですか?

はい。「範囲更新の遅延伝播」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。

「範囲更新の遅延伝播」で何を学びますか?

範囲全体への更新を後回しにします ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Coding Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「範囲更新の遅延伝播」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCoding Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 累積和のための Fenwick Tree
  2. BIT による転倒数
  3. セグメント木: 構築とクエリ
  4. 範囲更新の遅延伝播
← Coding Interview Prepに戻る