Худший случай обхода небинарного дерева

Я написал рекурсивный алгоритм, который проходит по небинарной древовидной структуре. Структура состоит из каталогов или файлов.

Алгоритм берет входной каталог (curDirectory) и сначала проходит глубину дерева. Когда он достигает конца ветки, он ищет файлы и печатает некоторую информацию. Затем он возвращает один уровень, ищет файлы и печатает материал и так далее. Мы не знаем количество подкаталогов или файлов в каталоге.

Как проанализировать худшее и среднее время для этого алгоритма?

for(int i = 0; i < curDirectory.getChildren().size(); i++){
        if (curDirectory.getChildren().get(i) instanceof INodeDirectory)
            blockCounter = blockCounter + digAndCount((INodeDirectory)curDirectory.getChildren().get(i));
    }

    for(int i = 0; i < curDirectory.getChildren().size(); i++){
        if (curDirectory.getChildren().get(i) instanceof INodeFile) {
            // print stuff and do other stuff 
        }
    }

person Simon Carlson    schedule 25.09.2014    source источник
comment
Лучший и худший по отношению к чему?   -  person Oliver Charlesworth    schedule 25.09.2014
comment
Сложность времени, добавил ее к моему вопросу.   -  person Simon Carlson    schedule 25.09.2014
comment
Да, но временная сложность относительно чего? Количество файлов? Количество каталогов? Что-то другое?   -  person Oliver Charlesworth    schedule 25.09.2014
comment
Я анализирую только файлы и каталоги. Поскольку это не двоичный файл, я не знаю, сколько дочерних элементов может иметь каталог, поэтому его глубина и ширина неизвестны. Как записать худшее и среднее время, не зная глубины, ширины или количества файлов в дереве?   -  person Simon Carlson    schedule 25.09.2014
comment
Это тета(n), потому что кажется, что вы идете по всему дереву. Неважно, бинарное это дерево, тринарное или вообще n-арное, сбалансировано оно или нет.   -  person chepner    schedule 25.09.2014
comment
Не обязательно, стартовой папкой может быть любая папка в дереве. Алгоритм учитывает только начальную папку и все папки под ней, а не ее родителей.   -  person Simon Carlson    schedule 25.09.2014
comment
Это линейно по количеству потомков предоставленной папки. Как говорит @chepner, важно только, чтобы структура каталогов была деревом; без разницы какое дерево. Если структура каталогов представляет собой граф (например, с символическими ссылками), то вам нужен более сложный алгоритм, линейный по количеству записей каталога, а не по количеству реальных объектов. В любом случае нет никакой связи с количеством файлов, поскольку у вас может быть неограниченное количество вложенных каталогов без обычных файлов ни в одном из них.   -  person rici    schedule 25.09.2014
comment
Это все еще тета(n); что касается алгоритма, начальная папка является корнем собственного n-дерева узлов. Часть дерева, которую алгоритм не будет посещать, не имеет значения.   -  person chepner    schedule 25.09.2014
comment
Может ли кто-нибудь написать объяснение того, как возникает тэта(n)? Я чувствую, что я близок к тому, чтобы получить это, но это не совсем щелкает.   -  person Simon Carlson    schedule 25.09.2014


Ответы (1)


В вашем дереве есть N каталогов и M файлов. При повторении каждый каталог и файл будут обработаны один раз. Таким образом, временная сложность будет O( M + N ). Или вы можете решить, что время обработки каталогов и файлов примерно одинаково, тогда вы можете сказать, что это O (N).

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

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

person Rafael Baptista    schedule 25.09.2014