2011-08-19 16 views
12

Espero escribir un algoritmo para sincronizar dos estructuras jerárquicas. Estas estructuras podrían ser gráficos de objetos, datos almacenados en tablas de bases de datos relacionales, etc. (incluso dos estructuras diferentes, siempre que tengan claves comparables). La sincronización será unidireccional, es decir, una estructura será el prototipo y la otra se modificará para coincidir.Sincronización unidireccional de dos jerarquías

Digamos que tenemos una función sync. Se tendría que aceptar la siguiente:

  1. objA - el prototipo
  2. objB - el objeto a ser modificado
  3. keyA - función de generación de claves para objA
  4. keyB - función clave de generación para objB
  5. addB - función para crear un objB (devuelve el ID del nuevo objB)
  6. setB - función para actualizar objB
  7. remB - función para borrar una objB
  8. parB - Identificación de los padres objB 's - esto se pasa a addB para el contexto

Así que tenemos esto:

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) = ... 

Ahora aquí es donde estoy teniendo problemas. 'a y 'b son jerárquicos, por lo que la función necesita saber qué propiedades de 'a y 'b debe atravesar (una vez que compara sus claves y decide que coinciden hasta el momento y deben atravesarse más). Para estas propiedades "secundarias", necesita todos los mismos argumentos pasados ​​para la sincronización, pero para sus respectivos tipos.

Aquí es cuando se hizo evidente que este es un problema de estructura de datos. ¿Cómo puedo encadenar esta información de manera que el objeto raíz se pueda pasar al sync y pueda atravesar los gráficos hacia abajo? Mi pensamiento inicial fue incorporar todos los argumentos en una clase, que tendría una propiedad para niños (un ResizeArray del mismo tipo). Pero con varias propiedades que tienen diferentes tipos, no pude encontrar una manera de hacerlo funcionar, salvo arrojar tipos por la ventana y hacer la mayoría o todos los argumentos de tipo obj.

Así que aquí están mis preguntas:

  1. ¿Existe un método bien establecido para hacer esto ya (no he podido encontrar nada)
  2. ¿Qué estructura de datos podría usar para encapsular el datos necesarios para hacer que esto funcione?

Hice mi mejor esfuerzo para explicar esto a fondo, pero si algo no está claro, por favor pregunte e intentaré proporcionar mejor información.

+0

Supongo que necesitará una estructura de datos intermedia en la que funcionará este algoritmo, también para varios tipos de datos, necesitará transformar esos datos a la estructura de datos intermedia, ejecutar el algoritmo y luego volver a transformarlo en datos originales formulario – Ankur

Respuesta

1

Estoy seguro de que esto es demasiado simplista, pero esta es mi idea.

Si se trata de un DAG, podría hacer un recorrido transversal de objA.Cuando encola un nodo de objA incluye objB y cualquier otra información que necesites (tupla). Luego, cuando dequeue arreglas objB.

Puede usar una unión discriminada para manejar diferentes tipos de niños en su enqueueing.

+0

idea interesante. Puede pasar un día o dos antes de que pueda probarlo. Se pondrá en contacto contigo. ¡Gracias por la sugerencia! – Daniel

+0

Esto conserva el problema original que son los diversos tipos de nodos secundarios. – Daniel

0

Genera diffgrams de las dos estructuras de datos y asigna las transformaciones al problema transformado.

Cuestiones relacionadas