【发布时间】:2021-02-14 18:17:01
【问题描述】:
我有这个算法
int count = 0;
for(int i = n; i >= 1; i = i/2) {
for ( int j = 1; j <= i; j++) {
count++;
}
}
我说这个的 Big-O 是 n/2 对吗?
【问题讨论】:
标签: java algorithm time-complexity big-o complexity-theory
我有这个算法
int count = 0;
for(int i = n; i >= 1; i = i/2) {
for ( int j = 1; j <= i; j++) {
count++;
}
}
我说这个的 Big-O 是 n/2 对吗?
【问题讨论】:
标签: java algorithm time-complexity big-o complexity-theory
TL;DR时间复杂度为O(n)。
更多详情
我说这个的 BigO 是 n/2 对吗?
不准确,在大 O 表示法中,您删除了常数部分,因此 (1/2)n 简化为 O(n)。
我不确定n/2 来自哪里,因为只有外循环
for(int i = n; i >= 1; i = i/2) {
...
}
是log2n 不是n/2。
两个循环一起使用:
int count = 0;
for(int i = n; i >= 1; i = i/2) {
for ( int j = 1; j <= i; j++) {
count++;
}
}
计数会在 N 和 2N 之间变化。
让我们计算一下:
int count = 0;
for(int i = n; i >= 1; i = i/2) {
for ( int j = 1; j <= i; j++) {
count++;
}
}
内部循环将执行 N 迭代,然后是 N/2,然后是 N/4 ...直到 N/N。
换句话说,我们有(N + N/2 + N/4 ... N/N),可以简化为N * (1/2 + 1/4 + .. + 1/2^L)),L = Log2 N。
这个(1/2 + 1/4 + .. + ) 系列is well-known for being 1。因此,我们可以将N * (1/2 + 1/4 + .. + 1/2^L))简化为O(N)。
【讨论】: