指示线运行次数的边界函数(大O)是多少?(C)
我试图理解运行时的概念,但在这个问题上我有点困惑。我知道外循环的运行时间是O(n)。我还知道,对于大于1000的n值,内部循环将以恒定时间运行。但是,对于n<1000的值,内部循环似乎具有对数运行时间。那么,这是否意味着函数的大O将是O(n logn),因为我假设了最坏的情况指示线运行次数的边界函数(大O)是多少?(C),c,runtime,big-o,C,Runtime,Big O,我试图理解运行时的概念,但在这个问题上我有点困惑。我知道外循环的运行时间是O(n)。我还知道,对于大于1000的n值,内部循环将以恒定时间运行。但是,对于n1000,内环将永远不会运行-在整数除法中进行因式分解时,j的起始值为零。因此,在n超过1000后,内环运行的次数与n完全无关-只有外部循环的前1000次迭代才会执行该内部语句 因为从长远来看,内部循环的迭代次数与n无关,所以在大O意义上,所指示的语句运行O(1)次 但是,如果将n保持为小,则循环运行的次数会出现对数增长。请注意,当i=1时,
for(i = 1; i < n; i++) {
for(j = 1000/i; j > 0; j--) {
arr[j]++; <-------- THIS LINE
}
}
(i=1;i{
对于(j=1000/i;j>0;j--){
arr[j]+;大O表示法描述了n接近无穷大时的行为。
A=O(B),其中A和B是n的函数,表示当n接近正无穷大时A/B的极限小于正无穷大。
因此,n=1000下的情况不影响大O表示法。该代码的渐近运行时间是O(1)即,无论n
有多大,都存在一个常数请注意,对于任何n>1000,内环将永远不会运行-在整数除法中进行因式分解时,j的起始值为零。因此,在n超过1000后,内环运行的次数与n完全无关-只有外部循环的前1000次迭代才会执行该内部语句
因为从长远来看,内部循环的迭代次数与n无关,所以在大O意义上,所指示的语句运行O(1)次
但是,如果将n保持为小,则循环运行的次数会出现对数增长。请注意,当i=1时,循环运行1000次,当i=2时,循环运行1000/2次,以此类推。忽略舍入的影响,在外循环的k次迭代后,内循环将运行
1000+1000/2+1000/3+…+1000/k
=1000(1/1+1/2+1/3+…+1/k)
=1000HK
次,其中Hk为第k次。第k次谐波数为Θ(logk),因此忽略循环迭代次数的四舍五入影响将对数增长
总之,短期内增长是对数增长,但由于整数除法,答案是O(1)
#include <stdio.h>
long long int test(long long int n) {
long long int ct = 0;
long long int i, j;
for (i = 1; i < n; i++) {
for (j = 1000/i; j > 0; j--) {
ct ++;
}
}
return ct;
}
int main(void) {
long long int n;
for (n = 1; n < 100000000; n *= 10) {
printf("testing with n = %lld: ct = %lld\n", n, test(n));
}
}
testing with n = 1: ct = 0
testing with n = 10: ct = 2827
testing with n = 100: ct = 5132
testing with n = 1000: ct = 7068
testing with n = 10000: ct = 7069
testing with n = 100000: ct = 7069
testing with n = 1000000: ct = 7069
testing with n = 10000000: ct = 7069