Односторонняя синхронизация двух иерархий - PullRequest
12 голосов
/ 20 августа 2011

Я надеюсь написать алгоритм для синхронизации двух иерархических структур.Этими структурами могут быть графы объектов, данные, хранящиеся в таблицах реляционных баз данных и т. Д. (Даже две разные структуры, если они имеют сопоставимые ключи).Синхронизация будет односторонней, то есть одна структура будет прототипом, а другая будет изменена для соответствия.

Допустим, у нас есть функция sync.Необходимо принять следующее:

  1. objA - прототип
  2. objB - объект, подлежащий модификации
  3. keyA -- функция генерации ключа для objA
  4. keyB - функция генерации ключа для objB
  5. addB - функция для создания objB (возвращает идентификатор нового objB)
  6. setB - функция для обновления objB
  7. remB - функция для удаления objB
  8. parB - идентификаторродителя 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, и он мог пересечь графики вниз?Моей первоначальной мыслью было включение всех аргументов в класс, который имел бы свойство children (ResizeArray того же типа).Но с различными свойствами, имеющими разные типы, я не мог найти способ заставить его работать, если не считать выбрасывания типов из окна и получения большинства или всех аргументов типа obj.

Так вотмои вопросы:

  1. Существует ли уже устоявшийся способ сделать это (я ничего не смог найти)
  2. Какую структуру данных я мог бы использовать для инкапсуляции данныхнеобходимо, чтобы это сработало?

Я старался изо всех сил объяснить это подробно, но если что-то останется неясным, пожалуйста, спросите, и я постараюсь предоставить более подробную информацию.

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Я уверен, что это слишком упрощает, но вот моя идея.

Если это DAG, вы можете выполнить обход objA в ширину. Когда вы ставите в очередь узел из objA, включите objB и любую другую необходимую вам информацию (кортеж). Затем, когда вы отключаете, вы исправляете objB.

Вы можете использовать различный союз для обработки различных дочерних типов в вашей очереди.

0 голосов
/ 22 августа 2011

Генерация диаграмм из двух структур данных и отображение преобразований в преобразованную проблему.

...