我编写了一个带有整数向量的函数,并返回两个元素之间的最小差异(即,彼此最接近的元素的差异)。
我正在尝试计算算法的复杂性。第一个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;
}
答案 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)