比较“组合”算法的两种实现方式之间的复杂度

时间:2019-05-11 13:00:01

标签: c++11 time-complexity

请考虑以下两种实现c(n,k)的实现,即找到一次选择n对象k的方式的数量。两种算法的时间复杂度如何比较?

我已经实现了动态编程实现,并尝试了一些测试用例,例如C(100,25),它的运行速度非常快。我想出了这种解决方案的时间复杂度为O(n ^ 2)。

另一种实现方式是使用C ++ STL库中可用的prev_permutationnext_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_permutationnext_permutation如何增加函数的时间复杂性。

0 个答案:

没有答案