该代码的渐近运行时是O(1)即不管n
多大,存在一个常数即<=
比执行线arr[j]++;
的次数,而且恒定恰好是相当小。
证明:
#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
它是由硬常数7069,这是从未超过,因为当n
超过1000时,该商将为0上界。