2017-08-07 14 views
1

私はすでにパーシスタンスセグメントツリーを作っていますが、現在はあるインデックスからあるインデックスへの範囲の更新があります。永続性セグメントツリーを複雑さを少なくして更新するには? 私はちょうどセグメントツリーで範囲更新を適用する方法は?

+0

ツリー全体を再構築しないでください。 * index *の話は、あなたが持っているものが木ではなくリストであることを暗示していますか?いくつかの(疑似)コードも便利です。 – diginoise

+0

私は3 2 4 1 5の配列を持っていると言うことができます。今度は、この配列のインデックス2からインデックス4までの最大数を見つけなければなりません。インデックスはこの配列のインデックスを意味します。最初に永続性ツリーを作成してからクエリに答えます。しかし、元の配列要素が1から3に更新されたと言うことができます。配列要素は3 6 2 4 5です。今度は同じクエリが再度要求されます。ですから、パーシスタンスセグメントツリー全体を再構築する必要があります。 – Souravirus

答えて

0

永続セグメントツリーを再構築しかし、今、元の配列要素は、配列の要素を今すぐ同じクエリが再び3 6 2 4 5頼まれている今、1から3に更新されていることを言うことができますしています。ですから、パーシスタンスセグメントツリー全体を再構築する必要があります。

範囲の更新では、範囲内の各要素を非数式で変更することを意味する場合、最適なオプションは、指定された範囲内の各要素に単一要素の更新を適用することです。これはO(range_sz * log n)になります。nはツリー内の要素の数です。

O(log n)で単一要素の更新を実行する方法を知っていることを前提としています。

"範囲内のすべての要素を指定した値v"にするなど、更新が制限されている場合、関連する範囲が更新に含まれているセグメントツリーのすべてのノードに対して遅延更新を使用できます一部のカスタムフィールドを値vに設定します。次に、照会するときに、ノードの範囲(照会範囲にその範囲が含まれている場合)を受け入れるたびにこのフィールドをチェックし、値がある場合はその値をmin/maxまたは照会しているものにします。

これにより、更新とクエリの両方がO(log n)に保持されます。

関連する問題