Нахождение большой тета-нотации функции


Итак, у меня есть петля, вложенная в петлю здесь:

int a,b,n;
for (a = 1; a <=n; a++) {
    for (b = 0; b < n; b+=a)
        cout << "hey" << endl;
}

N-это степень 2

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

Я знаю, что внешний цикл выполняется за O (n) время, но я не уверен насчет внутреннего цикла из-за b+=a. я знаю, что если бы у меня было время для обоих циклов, я мог бы умножить их, чтобы получить большое тета-время функции, но я не уверен, что это так. внутренняя петля работает на.

Когда я подключаю образец n (т. е. 2, 4, 8, 16), то внутренняя петля зацикливается 3, 9, 24, 61 раз соответственно. Я не вижу, как эти ценности соотносятся.

Правка:

Хорошо, я понимаю, что вы говорите, но я пытаюсь сравнить это с этой функцией. Каково было бы время для этой функции? Тогда я могу сравнить скорость этих двух:
int a,b,n;
int z = 1;
for (a = 0; a <n; a++) {
    for (b = 0; b < n; b=b+z)
        cout << "hey" << endl;
    z = z * 2;
}
1 2

1 ответ:

Можно видеть, что внутренний цикл выполняется столько раз, что a входит в n, то есть наибольшее целое число k, которое удовлетворяет:

Соответствует потолочной функции. Таким образом, общее число итераций внутреннего цикла равно:

Вторая сумма является делитель summatory функция, которое может быть написано:

Таким образом, временная сложность всего кода равна O(nlogn).

EDIT

О вторая часть кода, которую вы опубликовали, вычисления проще. Если n=2^k, то число итераций равно:

Таким образом, второй быстрее, так как это a O(n).