Algorithm Codibility标志挑战时间复杂性解释

Algorithm Codibility标志挑战时间复杂性解释,algorithm,time-complexity,Algorithm,Time Complexity,我最近试过了。不幸的是,我无法为自己找到解决方案,因此不得不参考他们的解决方案。我稍微调整了它们的实现,使其更具可读性,从而得到以下解决方案: public int solution(int[] A) { var N = A.Length; if (N < 3) return 0; var peaks = CalculatePeaks(A, N); var nextPeaks = CalculateNextPeaks(peaks, N);

我最近试过了。不幸的是,我无法为自己找到解决方案,因此不得不参考他们的解决方案。我稍微调整了它们的实现,使其更具可读性,从而得到以下解决方案:

public int solution(int[] A)
{
    var N = A.Length;
    if (N < 3)
        return 0;
    var peaks = CalculatePeaks(A, N);
    var nextPeaks = CalculateNextPeaks(peaks, N);
    var maxNumFlagsSet = 0;
    var peaksCount = peaks.Count(p => p);
    for (var i = 1; i <= peaksCount; ++i)
    {
        var pos = 0;
        var numFlagsSet = 0;
        while (pos < N && numFlagsSet < i)
        {
            pos = nextPeaks[pos];
            if (pos == -1)
                break;
            numFlagsSet += 1;
            pos += i;
        }

        maxNumFlagsSet = Math.Max(maxNumFlagsSet, numFlagsSet);
    }

    return maxNumFlagsSet;
}
我理解上述实现的正确性,但我不理解为什么解决方案算法的复杂性会增加。特别是以下嵌套循环:

for (var i = 1; i <= peaksCount; ++i)
{
    var pos = 0;
    var numFlagsSet = 0;
    while (pos < N && numFlagsSet < i)
    {
        ...
    }
}

提供我有限的理解:峰值计数的上限是√N、 因此,外部循环最多只能执行√N次,但是我们能推断出内部while循环将执行多少次呢?或者,这种推理完全走错了方向,有人可以提供一个关于复杂性的更简单解释?

每个外循环最多运行i次。因此,如果外部循环从0运行到√N、 然后在第一次外部迭代中,内部循环运行一次,然后运行2次,然后运行3次,以此类推。 计算机科学中一个众所周知的重要事实是,1到n的和是nn+1/2。也就是说,如果你有一个从1到n的for循环,把i加起来,你会得到nn+1/2。因此,运行1、2、3.的内部循环。。√N总共运行√N*√N+1/2,也就是O√N^2或ON