2011-08-19 11 views
12

2つの階層構造を同期させるアルゴリズムを書きたいと考えています。これらの構造は、オブジェクトグラフ、リレーショナルデータベーステーブルなどに格納されたデータ(同等のキーを持つ限り、2つの異なる構造であっても)です。同期は一方向、すなわち一方の構造はプロトタイプとなり、他方の構造は一致するように変更される。2つの階層の一方向の同期

syncの機能があるとします。プロトタイプ

  • objB - -
  • keyA
  • を変更するオブジェクト - objA
  • keyBための鍵生成機能 - キーの生成機能

    1. objA:それは次受け入れる必要がありますobjB
    2. addB - objB(新規ID:objB)を作成する関数
    3. setBからobjB
    4. parBを削除する機能 - - objB
    5. remBを更新する機能objBの親のID - これは文脈のためaddBに渡され

    だから我々は持っていますこれは

    let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k) 
         (addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit) 
         (parB:'p) = ... 
    

    ここで私は問題を抱えています。 'a'bは階層的であるため、関数は'a'bのどちらのプロパティをトラバースする必要があるかを知る必要があります(キーを比較し、これまで通り一致したと判断し、さらにトラバースする必要があります)。これらの「子」プロパティでは、syncに渡されるすべての同じ引数が必要ですが、それぞれの型に対して必要です。

    これは、これがデータ構造の問題であることが明らかになったときです。ルートオブジェクトをsyncに渡すことができるように、この情報を一緒に連結することができ、グラフを下方向にトラバースできますか?私の最初の考えは、すべての引数をクラスに組み込むことでした。このクラスは子プロパティ(同じタイプのResizeArray)を持ちます。しかし、さまざまな型を持つさまざまなプロパティでは、型をウィンドウの外に投げたり、型引数の大部分またはすべてを作成したりするのに手間がかからない方法を見つけられませんでした。objだからここ

    は私の質問です:

    1. すでにこれを行うための十分に確立された方法があります(私は何かを見つけることができていない)
    2. どのようなデータ構造私がカプセル化するために、使用する可能性がありますこの仕事をするために必要なデータ?

    私はこれを完全に説明しようと努力しましたが、何か不明な点が残っている場合は、質問してください。より良い情報を提供しようとします。

  • +0

    このアルゴリズムが機能する中間データ構造が必要です。さまざまなタイプのデータに対しても、そのデータを中間データ構造に変換し、algoを実行して元のデータに変換する必要がありますフォーム – Ankur

    答えて

    1

    これは簡単すぎると確信していますが、ここに私の考えです。

    これがDAGの場合、objAの幅優先横断を行うことができます。objAからノードをエンキューするときは、objBと必要なその他の情報(タプル)をインクルードします。その後、デキューするときにobjBを修正します。

    区別された共用体を使用して、エンキューする際に異なる子タイプを処理できます。

    +0

    興味深い考え。私が試してみるまでには、1日か2日かかっているかもしれません。あなたに戻ってきます。提案していただきありがとうございます! – Daniel

    +0

    これは、様々なタイプの子ノードである元の問題を保持します。 – Daniel

    0

    2つのデータ構造からdiffgramsを生成し、変換を変換された問題にマップします。