作为N的函数的增长顺序

时间:2015-04-30 11:38:32

标签: algorithm big-o time-complexity

我正在练习算法的复杂性,我认为下面的所有代码在增长的顺序方面都是二次的,但由于我需要增长的顺序作为N的函数,我认为改变了事情而我不这样做知道如何解决这个问题。

int sum = 0;
    for(int n = N; n > 0; n/=2)
    for(int i = 0; i < n; i++)
    sum++

int sum = 0;
    for(int i = 1; i < N; i*=2)
    for(int j = 0; j < i; j++)
    sum++

int sum = 0;
    for(int i = 1; i < N; i*=2)
    for(int j = 0; j < N; j++)
    sum++

1 个答案:

答案 0 :(得分:12)

int sum = 0;
    for(int n = N; n > 0; n/=2)
    for(int i = 0; i < n; i++)
    sum++

这是O(N),内部循环总计N + N/2 + N/4 + ... + 1次,当2N时此总和收敛到N->infinity,因此它是O(N)

int sum = 0;
    for(int i = 1; i < N; i*=2)
    for(int j = 0; j < i; j++)
    sum++

这与case1非常相似,我将把它作为练习留给你。按照我在那里做的相同方法,你会得到答案。

int sum = 0;
    for(int i = 1; i < N; i*=2)
    for(int j = 0; j < N; j++)
    sum++

这里,主要区别在于内环不依赖于外环的变量。这意味着,无论i的值如何,内循环都会重复N次。

因此,您需要了解外部循环重复的次数,并将其与N相乘。

在解释这些指导原则后,我也将其作为实践留下。