计算向量中值的最小差异的此函数的算法复杂度是多少?

时间:2013-11-07 08:48:51

标签: c++ algorithm time-complexity

我编写了一个带有整数向量的函数,并返回两个元素之间的最小差异(即,彼此最接近的元素的差异)。

我正在尝试计算算法的复杂性。第一个for循环迭代输入的所有元素(我将其称为N),这是线性复杂度:O(n)。内部for循环第一次迭代N - 1,然后是N - 2,N - 3,...... N - N + 2,N - N + 1,0。所以我不认为这个算法是O( N ^ 2)。我的猜测是O(N * log(N)),这是正确的吗?

#include <cstdlib>
#include <vector>

long int function(const std::vector<int> &Input)
{
    long int MinimumDifference = -1;

    for(size_t i = 0; i < Input.size(); i++)
    {
        for(size_t j = i + 1; j < Input.size(); j++)
        {
            long int Difference = abs(static_cast<long int>(Input[i] - Input[j]));
            if(Difference < MinimumDifference || MinimumDifference < 0)
            {
                MinimumDifference = Difference;
            }
        }
    }

    return MinimumDifference;
}

修改 所以上面是O(n ^ 2),认为我可以先通过排序列表来实现O(N * log(N))(使用std :: sort,它有O(N * log(N))),然后只是迭代列表以找到最小的差异。

#include <cstdlib>
#include <vector>
£include <algorithm>

void function(const std::vector<int> &Input)
{
    std::vector<int> SortedInput = Input;
    std::sort (SortedInput.begin(), SortedInput.end());

    long int MinimumDifference = -1;

    for(size_t i = 0; i < SortedInput.size() - 1; i++)
    {
        long int Difference = abs(static_cast<long int>(SortedInput[i] - SortedInput[i + 1]));
        if(Difference < MinimumDifference || MinimumDifference < 0)
        {
            MinimumDifference = Difference;
        }
    }

    return MinimumDifference;
}

2 个答案:

答案 0 :(得分:3)

一点代数操作告诉我们

(n-1) + (n-2) + ... + 1 = n * (n+1) / 2
                        = n^2 / 2 + O(n)

所以这个算法的复杂性确实是O(n^2)

答案 1 :(得分:0)

不,你是两个“大致相同”的循环,你的复杂性是O(n^2/2) = O(n^2)

为了说服自己,请认为sum(i) for i in [0,n] = n.(n+1)/2 = O(n^2/2) = O(n^2)正是你所做的。

要做一些“新手的复杂性”,只需计算叠加循环的数量。如果他们迭代基本元素,则乘以n,如果他们按顺序减少问题复杂度(分成两半的问题),则乘以log(n)