Нахождение большой тета-нотации функции
Итак, у меня есть петля, вложенная в петлю здесь:
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 ответ:
Можно видеть, что внутренний цикл выполняется столько раз, что a входит в n, то есть наибольшее целое число k, которое удовлетворяет:
Соответствует потолочной функции. Таким образом, общее число итераций внутреннего цикла равно:
Вторая сумма является делитель summatory функция, которое может быть написано:
Таким образом, временная сложность всего кода равна O(nlogn).EDIT
О вторая часть кода, которую вы опубликовали, вычисления проще. Если
n=2^k
, то число итераций равно:Таким образом, второй быстрее, так как это a O(n).