Давайте сначала разберемся с определениями обозначений.
Big O : Обозначает верхнюю границу алгоритма.
Большая тета : обозначает среднюю границу алгоритма.
Для вашего первого вопроса
public void guessWhat1(int N){
for (int i=N; i>0, i=i/2){
for (int j=0; j<i*2; j+=1){
System.out.println(“Hello World”);
}
}
}
Для i = N, внутренний циклвыполняется 2N раз, i = N / 2, внутренний цикл выполняется N раз, для i = N / 4 внутренний цикл выполняется N / 2 раза ..... поэтому общая сложность = O (2N + N + N / 2 +N / 4 + ... + 1), что равно O (N (2 + 1 + 1/2 + 1/4 + .... 1 / N)) = O (N (3 + 1/2 +1/4 + .... 1 / N))
N (3 + 1/2 + 1/4 + .... 1 / N) = N (3 + 1 - (0,5) ^logN) = O (N (4-1 / N)) = O (N) Таким образом, сложность составляет O (N), даже в тета-нотации тот же N, что и в предыдущих циклах, занимает одинаковое время для всех случаев.
На ваш второй вопрос
public void guessWhat2(int N) {
int i=1, s=1;
while (s<=N) {
i += 1;
s = s + i;
}
}
Цикл while принимает O (sqrt (N)).Как и выше, здесь также тета-нотация также будет такой же, как и большая О-нотация, то есть sqrt (N).
Тета-нотация отличается от большой О, если входные данные имеют несколько случаев.Давайте рассмотрим пример вставки sort https://en.wikipedia.org/wiki/Insertion_sort, где N - размер входного массива.Если входной массив уже отсортирован, это занимает линейное время, но если входной массив отсортирован в обратном порядке, для сортировки массива требуется N ^ 2 времени.
Таким образом, в этом случае для сортировки вставкой временная сложность равна O (N ^ 2).
В лучшем случае это тета (N), а в худшем случае - тета (N ^ 2).).