Вопрос

<Сильная> Короткие версии: В дереве (без двоичной) с множеством уровней детей, где каждый узел может иметь несколько листьев, каков наилучший способ подсвечивать листья, которые соответствуют определенному состоянию, приведенным узлом?

<Сильная> Длинная, запутанная версия: Скажем, у вас есть папки, которые могут содержать больше папок. В производстве, моя система имеет около 15 слоев папок в самом глубоком. Каждая папка может иметь документы.

Когда пользователь навигаций к папке, им нужно знать, сколько документов в этой папке, всего. Им также нужно знать, сколько из этих документов были «помечены». Документы могут быть помечены, если после определенного периода времени они не были обновлены. Это определяется на основе истории записей - возьмите последнюю запись истории для папки, если он больше X, то он помечен.

Прямо сейчас, я итасив все папки> Подпапки> ETC> Дети, чтобы проверить запись истории и рекурсивно. Это довольно медленно, поэтому мне нужен новый подход.

Я придумал два варианта, но хочу знать, есть ли лучший подход, или какой из них лучше всего.

Опция 1 : всякий раз, когда добавляя документ или удаление документа, итерацию родительского графа и увеличение / уменьшение свойства «DocumentCount», которое хранится в объекте папки. Это означает, что добавление / удаление принять минимальный удар производительности. Но проблема здесь заключается в том, что мне на самом деле нужно подсчитать общее количество документов, а также общее количество помещенных документов (проверяя записи истории), так что это означает, что мне нужно другое поле и другой процесс, когда это Изменения статуса. Это представляет еще более сложность, как проверяет, является ли что-то помечено, это вызов метода, а не свойство.

Вариант 2: есть задание таймера и обновить свойства «DocumentCount» и «UnopedDocumentCount» каждой папки в системе, было бы большим количеством циклов ЦП и кажется расточительными.

вариант 3 : Просто думал об этом - может быть, итерация по каждому документу и видя, если документ является прямым или удаленным ребенком целевого узла до того, как оценка будет лучше, чем итерация через рекурсию. Я чувствую, что это будет лучше для узлов высоко на дереве, но итерация на каждого ребенка для низкоуровневого узла будет смешным. Хммм ...

Я соблазн реализовать вариант 1 .. Какие еще варианты есть?

Это было полезно?

Решение

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

Точно так же, как вы обновляете узлы, вы отмените к ним, а затем раскрутите рекурсии и обновите родителей.

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

Примечание. Если вышеизложенное не имеет смысла для вас, прочитайте Knuth Vol.1 .

Лицензировано под: CC-BY-SA с атрибуция
scroll top