Требуются: теория копирования, перемещение в узлах деревьев (например, перетаскивание) - PullRequest
1 голос
/ 15 марта 2012

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

Это становится забавным, когда объекты перемещаются в пределах одного и того же родителя.Или когда объекты не разрешены в определенных узлах, хотя я позволяю пользователю их туда отбрасывать, я усложняю их окончательное расположение.После нескольких недель и нескольких исправлений ошибок в течение первых нескольких выпусков я заставил эту процедуру всегда вести себя, как ожидалось.Я думаю.Но я не уверен, потому что этот метод был разработан ad hoc .Это означает: когда я нашел что-то, что не работало, я исправил это.

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

Когда я смотрю на этот код, мне кажется, что какой-то ученый мог бы в какой-то момент написать главу учебника или что-то на эту тему, и я должен купить эту книгу, прочитать ее, вырвать мою ad hoc код и сделайте это правильный способ.Но я не могу найти ни одного в веб-поиске.Кто-нибудь знает такую ​​книгу?

А может и нет.Может быть, это один из тех случаев, когда после того, как все сказано и сделано, каждое приложение слишком разное, чтобы предложить общее решение?

Спасибо,

Джерри Кринок

1 Ответ

0 голосов
/ 15 марта 2012

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

Есть ли у пользователей, перетаскивающих 1000 элементов, проблемы с результирующей задержкой?

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

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

...