13

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

関数があるとしましょうsync。以下を受け入れる必要があります。

  1. objA- プロトタイプ
  2. objB-- 変更するオブジェクト
  3. keyA-- 鍵生成関数objA
  4. keyB-- 鍵生成関数objB
  5. addB-- を作成する関数objB( new の ID を返すobjB)
  6. setB-- 更新する関数objB
  7. remB-- を削除する関数objB
  8. parB-- の親の ID -- これはコンテキストのために にobjB渡されます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. これを機能させるために必要なデータをカプセル化するには、どのデータ構造を使用すればよいでしょうか?

丁寧に説明するよう心がけておりますが、ご不明な点がございましたらお気軽にお尋ねください。

4

2 に答える 2

1

これは単純化しすぎていると思いますが、これが私の考えです。

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

識別された共用体を使用して、エンキュー内のさまざまな子タイプを処理できます。

于 2011-08-20T03:31:14.840 に答える
0

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

于 2011-08-22T19:31:40.047 に答える