[解決済み] フラットな構造から効率的にツリーを構築する方法とは?
2022-04-15 10:44:48
質問
フラット構造のオブジェクトがたくさんあります。これらのオブジェクトは
ID
と
ParentID
プロパティがあるので、ツリーに並べることができます。これらは順不同です。
それぞれ
ParentID
プロパティは、必ずしも
ID
を構造体の中に入れる。したがって、これらのオブジェクトから複数のツリーが出現する可能性があります。
これらのオブジェクトをどのように処理し、ツリーを作成するのでしょうか?
解決策には遠く及ばないが、最適には程遠いのでは......。
私は、これらのツリーを作成し、データベースにデータを挿入する必要があります、適切な順序で。
循環参照はありません。Nodeは、ParentID == nullのとき、またはParentIDが他のオブジェクトに見つからないとき、RootNodeになります。
解決方法は?
オブジェクトのIDを、特定のオブジェクトにマッピングしてハッシュテーブルに格納する。すべてのオブジェクトを列挙し、その親が存在する場合はそれを見つけ、それに応じてその親ポインタを更新します。
class MyObject
{ // The actual object
public int ParentID { get; set; }
public int ID { get; set; }
}
class Node
{
public List<Node> Children = new List<Node>();
public Node Parent { get; set; }
public MyObject AssociatedObject { get; set; }
}
IEnumerable<Node> BuildTreeAndGetRoots(List<MyObject> actualObjects)
{
Dictionary<int, Node> lookup = new Dictionary<int, Node>();
actualObjects.ForEach(x => lookup.Add(x.ID, new Node { AssociatedObject = x }));
foreach (var item in lookup.Values) {
Node proposedParent;
if (lookup.TryGetValue(item.AssociatedObject.ParentID, out proposedParent)) {
item.Parent = proposedParent;
proposedParent.Children.Add(item);
}
}
return lookup.Values.Where(x => x.Parent == null);
}
関連
-
その他 - 等差数列はいくつあるか?(ジャワ)
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] O(log n)とは具体的にどのような意味ですか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] 一意な(繰り返しのない)乱数をO(1)で?
-
[解決済み] javascriptでフラット配列からツリー配列を構築する
-
[解決済み] 3つのスタックを持つ待ち行列を実装するには?
-
[解決済み] 短い文字列のための効率的な圧縮アルゴリズム[closed]。
-
[解決済み] ロードされたサイコロをシミュレートするための効率的なデータ構造とアルゴリズムとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] マージソートの時間および空間の複雑さ
-
[解決済み] O(log n)とは具体的にどのような意味ですか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] 短縮URLの作成方法を教えてください。[クローズド]
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] 任意の二分木における2つのノードの最小公倍数の先祖を見つけるには?
-
[解決済み] 一意な(繰り返しのない)乱数をO(1)で?
-
[解決済み] ハッシュテーブルとトライ(プレフィックスツリー)のどちらを選べばいいですか?
-
[解決済み] O(1), O(n log n), O(log n)の複雑さを持つアルゴリズムの例