2017-08-20 17 views
2

任意のツリー(バイナリツリーではない)が与えられると、各ノードは整数とラベル付けされます。 ツリー内でn個の最大ノードを見つけるにはどうすればよいですか? ツリーに{43,253,48,62,91,641}が含まれ、3つの最大ノードが要求された場合、アルゴリズムは< 641,253,91>を返す必要があります。任意のツリー内でn個の最大ノードを見つける

すべてのC++(または任意の言語)の標準ライブラリ関数/データ構造が許可されています。 スペースが一定である限り、ノードにフィールドを追加することもできます。同様に、各ノードに最大の子を指すようにフィールドを追加できますが、すべての子をソート順に格納するArrayListを持つことはできません。

新しいプログラマーとして、私はこの質問に数日を費やしました。単純なグラフ検索アルゴリズム(BFS、DFS)は機能し、実装が簡単ですが、ツリー全体で網羅的な検索を行っているため、高速ではありません。

この問題を解決するにはどうすればよいですか?

+1

ツリーが任意の場合は、おそらくすべてのノードを検索してn個の最大ノードを検索する必要があります。 – Cuber

+0

@BeLikeJo:各ノードに最大の子を指すようにフィールドを追加することは、ノードの数に対して線形であることに注意してください。すべての子を順番に格納するためのarraylistを追加することは、ノードの数に線形です。だから、あなたの制限( "一定のスペースの使用")は少し奇妙です。私はまた、そのようなフィールドはどちらもあなたの問題を解決しないことに気付くでしょう。任意のツリーは単なるツリーになり、すべてのノードに当ることなくトラバースすることは不可能です。私は、各ノードがツリーと無関係な子ノードを持つことを止めるものはないと考えています。そのため、実際には2つのツリー(そのうちの1つはバイナリ)で作業しています。 – Brian

答えて

3

新しいプログラマーとして、私はこの質問に数日を費やしました。単純なグラフ検索アルゴリズム(BFS、DFS)は機能し、実装が簡単ですが、ツリー全体で網羅的な検索を行っているため、高速ではありません。

ツリーはバイナリツリーではないので、ノードを調べても子ノードに関する追加情報は得られません。したがって、ツリー全体を網羅的に検索することなくK個の最高値を生成するアルゴリズムを実装することはできません。言い換えれば、任意の値の配列を並べ替えた場合よりも優れたパフォーマンスは得られません。

O(N * logK)時間でK値を取得するには、任意のツリーをトラバースするときにK要素のpriority queueを維持します。

0

与えられたツリーは特別な性質を持たない任意であるため。 1つの最高値の子を見つけるには、グラフ全体を検索する必要があります。それの複雑さO(n)。トップK最高値の子どもたちのために

あなたがOを持っている(N * Kを記録)時間 - プライオリティキューベースのソリューション、dasblinkenlightの答えで述べたように。

あなたはMedian of MedianのO(N)時間の解も持っています。

関連する問題