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