2011-08-19 34 views
12

我希望編寫一個算法來同步兩個層次結構。這些結構可以是對象圖,存儲在關係數據庫表中的數據等(甚至兩種不同的結構,只要它們具有可比較的鍵)。同步將是單向的,即一個結構將成爲原型,另一個將被修改爲匹配。兩個層次結構的單向同步

假設我們有一個sync函數。這將需要接受以下幾點:

  1. objA - 原型
  2. objB - 修改
  3. keyA對象 - 爲objA
  4. keyB密鑰生成函數 - 密鑰生成函數爲objB
  5. addB - 函數創建一個objB(返回id爲新的objB
  6. setB - 功能更新objB
  7. remB - 功能刪除objB
  8. parB - 這是傳遞給addB上下文

因此,我們必須 - objB的父的ID這:

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,並且它可以向下遍歷圖表?我最初的想法是將所有的論據都納入一個班級,這個班級將有一個兒童特性(一個ResizeArray同一類型)。但是,對於具有不同類型的各種屬性,我無法找到一種使其工作的方法,但缺少將窗口類型扔出窗口並使大部分或全部類型參數obj

因此,這裏是我的問題:

  1. 是否有這樣做已經(我一直沒能找到任何東西)
  2. 什麼數據結構,我可能會使用封裝一套行之有效的方法使這項工作成爲必要的數據?

我已盡全力解釋這一點,但如果有任何問題仍不清楚,請詢問,我會盡力提供更好的信息。

+0

我想你需要一箇中間數據結構,這個算法也可以工作,對於各種類型的數據,你需要將這些數據轉換爲中間數據結構,運行算法,然後將其轉換回原始數據表格 – Ankur

回答

1

我確信這只是簡單化了,但這是我的想法。

如果這是一個DAG,你可以做objA的廣度優先遍歷。當你從objA include objB和你需要的任何其他信息(元組)排入節點時。然後當你出列你修理objB。

您可以使用歧視聯盟來處理排隊中的不同子類型。

+0

有趣的想法。在我可以試用它之前可能需要一兩天的時間。會回到你身邊。感謝您的建議! – Daniel

+0

這保留了原始問題,即子節點的不同類型。 – Daniel

0

從兩個數據結構中生成diffgrams並將轉換映射到轉換後的問題。