У меня много проблем с этой проблемой алгоритмов. Я должен найти большой тета-анализ следующего алгоритма:
function example(n):
int j=n
for i=0;i<n;i++:
doSomethingA()
for k=0;k<=j;k++:
doSomethingB()
j/=2
Мой подход состоит в том, чтобы разбить все выполнение алгоритма на две части. Одна часть, где вызываются doSomethingA() и doSomethingB(), а вторая часть после того, как j становится 0, вызывается только doSomethingA() до тех пор, пока программа не остановится.
При таком подходе часть 1 выполняется для итераций Logn внешнего цикла, а часть 2 — для итераций n-logn внешнего цикла.
Количество запусков внутреннего цикла уменьшается вдвое для каждого запуска, поэтому общее количество запусков должно быть 2n-1. Таким образом, время выполнения части 1 должно быть (2n-1)*c, константа. Я не совсем уверен, что это действительно
Для части 2 работа внутри цикла всегда постоянна, и цикл повторяется (n-logn) раз.
Итак, мы имеем ((2n-1)+(n-logn))*c
Я не уверен, что работа, которую я сделал до сих пор, правильна, и я не уверен, как продолжить. Моя интуиция подсказывает мне, что это O(n), но я не уверен, как рационализировать это в большой тета. Помимо этого, возможно, весь мой подход ошибочен. Как я должен атаковать такой вопрос? Если мой подход верен, как мне его завершить?
Спасибо.