Как я могу различить два дерева, чтобы определить родительские изменения? - PullRequest
3 голосов
/ 01 декабря 2010

У меня есть древовидная структура, которую нужно переставить (перетащить и отпустить), а затем отправить изменения.

Что будет лучшим способом для получения изменений?На мой взгляд, есть два способа:

  1. Сохранить каждую команду изменения, отправить список изменений, затем выполнить каждую
  2. Сериализировать дерево и затем разнести новое дерево со старымдерево, чтобы выяснить, что изменилось, затем выполнить изменения

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

2 позволяет избежать вышеуказанной проблемы, но как я могу "различить" деревья, чтобы определить, какие родительские команды изменения нужно выполнить?Предположительно, есть алгоритмы для этого?

Редактировать Для пояснения, у каждого узла есть "id" и "parentId".Мне нужно разрешить пользователям переупорядочивать дерево (изменяя таким образом parentId некоторых узлов).

Для варианта 2 достаточно просто упростить сериализацию измененного дерева, а затем обработать различия итерацией поисходное дерево в предзаказе, найти тот же узел в новом дереве и записать изменение, если родители разные?это надежный подход, который не застрянет в цикле?

Edit на самом деле нет, это не сработает.Мне нужно перебрать дерево NEW в предзаказе и найти соответствующий узел в старом дереве, затем указать идентификаторы родительского элемента и т. Д.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Если деревья не огромные, может быть проще всего удалить старое дерево и затем добавить новое дерево.

Различие двух деревьев, когда разрешенные операции включают в себя перемещения, удаления, добавления, будет гораздо более сложным, поэтому, если не будет получено значительного преимущества, вероятно, лучше избегать этой сложности и использовать простой параметр удаления-добавления-добавления .

0 голосов
/ 02 декабря 2010

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

Могут быть сценарии

1 - Ребенок, добавленный к родителю (перетаскиванием)

2 - Родитель добавлен к ребенку (перетаскиванием)

3 - одно дерево переместилось на другое дерево. (Путем объединения корневых узлов) (это может быть неприменимо в вашем сценарии)

с точки зрения реализации, я использовал C # в качестве языка.

Мой подход к проблеме

1- Создать структуру памяти, которая представляет дерево
2- Когда пользователь перемещает узел, измените родительский идентификатор (необходимо убедиться, что он не приводит к циклу)

3- Пересоздайте дерево так, чтобы представление в памяти всегда обновлялось.

4 - взять в память представление и сохранить.

поэтому в моей точке реализации № 3 крайне важен, так как я всегда держу в памяти последнее дерево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...