首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段代码的复杂度是多少?

问这段代码的复杂度是多少?
EN

Stack Overflow用户
提问于 2015-07-31 20:52:34
回答 2查看 99关注 0票数 5

我的代码是:

代码语言:javascript
复制
vector<int> permutation(N); 
vector<int> used(N,0);

void try(int which, int what) {
  // try taking the number "what" as the "which"-th element
  permutation[which] = what;
  used[what] = 1;

  if (which == N-1)
    outputPermutation();
  else
   // try all possibilities for the next element
  for (int next=0; next<N; next++)
    if (!used[next])
    try(which+1, next);

  used[what] = 0;
} 

int main() {
  // try all possibilities for the first element
  for (int first=0; first<N; first++)
    try(0,first);
}

我在某个网站上发现了这段代码,我从中学到了复杂性。根据我的理解,下面这一行迭代N次。因此,复杂度为O(N)。

代码语言:javascript
复制
for (int first=0; first<N; first++)

接下来,我将考虑递归调用。

代码语言:javascript
复制
for (int next=0; next<N; next++)
   if (!used[next])
    try(which+1, next);

因此,这个递归调用包含步骤数= t(n) = N.c +t(0)。(其中有一些常量的步骤),我们可以说,对于这个步骤,复杂度是= O(N)。

因此,总复杂度为- O(N.N) = O(N^2)。

我的理解对吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-31 21:35:29

该算法的复杂度为O(N!)(甚至O(N!* N),如果outputPermutation采用O(N) (这似乎是可能的)。

该算法不重复地输出0.N自然数的所有排列。

递归函数try本身依次尝试将N个元素放置在which位置,每次尝试,它都递归地为下一个which位置调用自己,直到which达到N1为止。另外,对于每次迭代,try实际上被调用(N - which)次,因为在每个级别上,为了消除重复,某些元素被标记为used。因此,该算法采用N*(N-1)*(N-2).1步。

票数 3
EN

Stack Overflow用户

发布于 2015-07-31 21:14:33

它是一个递归函数。函数" try“递归地调用自己,因此main ()中有一个循环,try ()中有一个循环,用于try ()的递归调用中有一个循环,下一个递归调用中有一个循环用于try (),等等。

您需要非常仔细地分析这个函数的功能,否则会得到一个完全错误的结果(就像您所做的那样)。您可以考虑实际运行此代码,其值为N=1至20,并测量时间。你会发现它绝对不是O (N^2)。实际上,不要跳过N的任何值;您将看到其中的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31754988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档