В формальном определении, если мы предположим, что сложность getHeight
равна G(n)
, а T(n)
- это сложность функции isBalance
, у нас будет G(n) = G(n1) + G(n2) + 1
и T(n) = T(n1) + T(n2) + G(n) + 1
такой, что n1
будет размер левого поддерева, n2
- размер правого поддерева, n1 + n2 = n - 1
.
Попробуйте расширить G(n) = (G(n11) + G(n12) + 1) + (G(n21)+G(n22) + 1) + 1
, чтобы n11 + n12 + n21 + n22 = n1 - 1 + n2 - 1 = n - 3
. Следовательно, G(n) = G(n11) + G(n12) + G(n21) + G(n22) + 3
. Используя индукцию, мы можем найти, что G(n) = Theta(n)
. Поэтому у нас есть T(n) = T(n1) + T(n2) + \Theta(n) + 1
.
Теперь, если высота разности поддеревьев больше 1, алгоритм вернет false и будет прерван, наихудший случай - |log(n2) - log(n1)| <= 1
(log(n{i})
- высота поддерева i
). Следовательно, при включении питания 2
мы получаем n2/n1 <= 2
. Это означает, что n1
и n2
являются постоянным фактором n
, как у нас было n1 + n2 = n -1
. Теперь из теоремы Акра-Бацци , p = 1
(приблизительно) и g(n) = n
(как \Theta(n)
) сложность T(n)
в худшем случае составляет n*(1 + integral(x/x^2, 1, n)) = n*(1 + integral(1/x, 1, n) = n * (1 + log(n))
. Следовательно, T(n) = O(n log(n))
.