2017-07-14 3 views
0

私は配列を持っていて、インデックスiからjまでのすべての要素の合計を見つけるようなクエリに答える必要があります。ノードiからjへのパスに対してこのようなクエリに答えるのと同じように、 iからjまで存在する唯一の経路)。ツリー上のパスでクエリに答えるには?

LCA私はそれを線形配列に分解してセグメントツリーを使用する範囲最小クエリを使用して検索する方法を知っていますが、サムクエリに対しては変更できません。それ、どうやったら出来るの?

+0

あなたは何を試してみましたか?コードを貼り付けて、私のコードやロジックを簡単にデバッグすることができますか?私はすべてのコードを私に与えたくありません。かなり簡単です.. – zenwraight

+0

@zenwraight今は論理がありません、それは私が質問で尋ねたものです。私は線形配列ではなくツリー上で距離合計クエリを求めています。 – anker

+1

ああ、それでは、ツリー上でdfsまたはbfsを実行してから、値を配列に保存してから、合計範囲のクエリを計算する必要があるかもしれません。 – zenwraight

答えて

0

これは処理の要件によって異なります。複雑さの制限がありますか、または昼食時に作業可能で保守可能なコードを持つことが目標ですか?

それは後者だ場合は、シンプルなアプローチを取る:

  • は、ツリー内の両方のノードを検索します。
  • 最初のノードからルートにトラバースし、パスコストを合計し、各ノードで部分和を維持します。
  • 2番目のノードから、ルートに向かってトラバース・アンド・サム(全合計のみ、部分なし)も開始します。
  • 最初のノードの祖先であるノードに遭遇すると、LCAが見つかりました。
  • 現在の合計を、LCAの最初のノードの部分合計に加算します。完了しました。

このアルゴリズムは、第1期のデータ構造の学生が容易に理解できます。 LCAの一貫性チェックでは、O(log(n)^ 2) - 悪くはないが、LCAの線形事前作業と一定時間問合せリターンの最適化はできません。


あなたが速いアルゴリズムが必要な場合は、その後、私は、各ノードはまた、その先祖の各部分和のハッシュされたリスト(例えばPython辞書)を計算するようにあなたはLCA事前作業アルゴリズムを強化することを示唆しています。これを済ませれば、LCAの一定時間計算と各部分合計の一定時間ルックアップが得られます。

関連する問題