请考虑以下两种实现c(n,k)
的实现,即找到一次选择n
对象k
的方式的数量。两种算法的时间复杂度如何比较?
我已经实现了动态编程实现,并尝试了一些测试用例,例如C(100,25),它的运行速度非常快。我想出了这种解决方案的时间复杂度为O(n ^ 2)。
另一种实现方式是使用C ++ STL库中可用的prev_permutation
或next_permutation
,该语言取自here,最初来自Rosetta Code。该函数here的文档说它在线性时间内工作,最大间隔为(第一个,最后一个)之间的距离的一半,所以它位于外面的循环会使得整个复杂度再次成为n平方?(我不确定关于这部分,这是我需要帮助的地方。
size_t combinations_dp (int n, int k) {
vector <vector<size_t>> grid (n + 1, vector<size_t> (k + 1, 0));
// base cases
for (int i = 0; i <= n; i ++) {
for (int j = 0; j <= k; j ++) {
if (i == j) grid[i][j] = 1;
if (j == 0) grid[i][j] = 1;
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j == 0 || j >= i) continue;
else {
grid[i][j] = grid[i-1][j-1] + grid[i-1][j];
}
}
}
return grid[n][k];
}
void combinations_bits(N, K) {
vector<bool> arr (K, 1);
arr.resize(N, 0);
long long count = 0;
do {
count ++;
} while (prev_permutation(arr.begin(), arr.end()));
cout << count << "\n";
}
我不确定两个实现的复杂性如何相互比较,尤其是函数prev_permutation
和next_permutation
如何增加函数的时间复杂性。