Введение
Привет
Мне задали этот вопрос сегодня в классе, и это хороший вопрос!Я объясню здесь и надеюсь, что мой более официальный ответ будет рассмотрен или исправлен там, где он неправильный.:)
Предыдущие ответы
Наблюдение @Assaf также является правильным, поскольку обход двоичного дерева рекурсивно проходит один раз для посещения каждого узла.
Но !, поскольку он рекурсивныйАлгоритм, вам часто приходится использовать более продвинутые методы для анализа производительности во время выполнения.При работе с последовательным алгоритмом или алгоритмом, использующим циклы for, часто достаточно использовать суммирование.Итак, ниже приводится более подробное объяснение этого анализа для любопытных.
Повторение
Как уже говорилось ранее,
T (n) =2 * T (n / 2) + 1
, где T (n) - количество операций, выполненных в вашем алгоритме обхода (порядок, предварительный порядок или пост-порядок не имеют значения).
Объяснение повторения
Существует два T (n) , потому что обходы inorder, preorder и postorder все вызывают себя на левом и правом дочернем узле.Думайте о каждом рекурсивном вызове как T (n) . Другими словами, ** левый T (n / 2) + правый T (n / 2) = 2 T (n / 2) **«1» происходит от любых других операций с постоянным временем в функции, таких как печать значения узла и т. Д. (Честно говоря, это может быть 1 или любое постоянное число, и асимптотическое время выполнения все еще вычисляется в то же значение. Объяснениеследует.).
Анализ
Этот рецидив на самом деле можно проанализировать с помощью большой тэты с использованием мастеорема Терс.Итак, я буду применять его здесь.
T (n) = 2 * T (n / 2) + постоянная
где постоянная - некоторая постоянная (может быть 1или любая другая константа).
Используя теорему Мастера , мы имеем T (n) = a * T (n / b) + f (n) .
Итак, a = 2, b = 2, f (n) = константа , поскольку f (n) = n ^ c = 1 , то следуетчто c = 0 , поскольку f (n) является константой.
Отсюда мы можем видеть, что a = 2 и b ^ c = 2 ^ 0 = 1 .Итак, a> b ^ c или 2> 2 ^ 0 .Итак, c или 0
Отсюда мы имеем T (n) = BigTheta (n ^ {logb (a)}) = BigTheta (n ^ 1) = BigTheta (n)
Если вы не знакомы с BigTheta (n), это "похоже" (пожалуйста, потерпите меня :))до O (n) , но это "более жесткая граница" или более точное приближение времени выполнения.Итак, BigTheta (n) является наихудшим O (n) и лучшим BigOmega (n) во время выполнения.
Надеюсь, это поможет.Береги себя.