Algorithm 跟踪算法的运行时复杂性

Algorithm 跟踪算法的运行时复杂性,algorithm,time-complexity,Algorithm,Time Complexity,给定一个多达10000个整数的序列(0

给定一个多达10000个整数的序列(0 解决这个问题的明显方法是递归下降法。我们只需要找到循环和终止条件。考虑以下解决方案:

 1 #include <stdio.h>


 2  long n, sequence[10000];
 3  main () {
 4       FILE *in, *out;                     
 5       int i;                             
 6       in = fopen ("input.txt", "r");     
 7       out = fopen ("output.txt", "w");   
 8       fscanf(in, "%ld", &n);             
 9       for (i = 0; i < n; i++) fscanf(in, "%ld", &sequence[i]);
10       fprintf (out, "%d\n", check (0, 0, 999999));
11       exit (0);
12  }


13  check (start, nmatches, smallest) {
14      int better, i, best=nmatches;
15      for (i = start; i < n; i++) {
16          if (sequence[i] < smallest) {
17              better = check (i+1, nmatches+1, sequence[i]);
18              if (better > best) best = better;
19          }
20      }
21      return best;
22  }
1#包括
2长n,序列[10000];
3主要(){
4文件*输入,*输出;
5国际一级;
6in=fopen(“input.txt”,“r”);
7 out=fopen(“output.txt”,“w”);
8个fscanf(在、%ld、&n中);
9表示(i=0;i最好)最好=更好;
19          }
20      }
21返回最佳;
22  }
第1-9行和第11-12行可以说是样板。他们设置一些标准变量并获取输入。神奇之处在于第10行和递归例程
检查
检查
例程知道应该从哪里开始搜索较小的整数、到目前为止最长序列的长度以及到目前为止最小的整数。在额外呼叫的代价下,当启动不再在适当的范围内时,它会自动终止。
检查
程序本身很简单。它沿着列表遍历,寻找比目前为止最小的整数更小的整数。如果找到,
check
递归调用自身以查找更多信息

我认为最坏的情况是输入顺序完全相反 像

10987654321


所以这个算法的运行时复杂性是什么,我很难找到它…

您的问题陈述与最长的递增子序列问题相匹配

你什么都没做。在最坏的情况下,您的实现复杂性是
O(n^n)
。因为在每次递归调用中,它都会生成
(n-1)
递归调用等等。试着画一棵树并检查叶子的数量。 `

查看此链接


此外,为了有效实施和获得更多知识,请检查以下内容:

您的问题陈述与最长递增子序列问题相匹配

你什么都没做。在最坏的情况下,您的实现复杂性是
O(n^n)
。因为在每次递归调用中,它都会生成
(n-1)
递归调用等等。试着画一棵树并检查叶子的数量。 `

查看此链接


此外,为了高效实施和更多知识,请检查以下内容:

它不是“最大递减子序列”,而是“最长递减子序列”。它类似于“最长增长子序列”,这是一个具有专用维基百科页面的经典问题。在这里询问之前,您是否已经检查过这些资源?运行时复杂性通常用三个量来描述:平均、最佳和最坏情况。你在找哪一个?你已经注意到了最坏的情况-总结递归调用-最好的情况是线性的,平均值会更复杂。正如@o900所说的,这是一个已确定的问题。从您的解决方案的外观来看,只能给出一个建议:尝试总体解决问题,而不是一开始就考虑时间复杂性。一旦您建立并验证了一个实现,您就可以对其进行精简或确定更好的解决方案。它不是“最大递减子序列”,而是“最长递减子序列”。它类似于“最长增长子序列”,这是一个具有专用维基百科页面的经典问题。在这里询问之前,您是否已经检查过这些资源?运行时复杂性通常用三个量来描述:平均、最佳和最坏情况。你在找哪一个?你已经注意到了最坏的情况-总结递归调用-最好的情况是线性的,平均值会更复杂。正如@o900所说的,这是一个已确定的问题。从您的解决方案的外观来看,只能给出一个建议:尝试总体解决问题,而不是一开始就考虑时间复杂性。一旦建立并验证了一个实现,您就可以随时缩减它或确定更好的解决方案。
          n
        / \ \..........
       /   \            \
    (n-1)  (n-1) ...... (n-1)
   /  \
(n-2) (n-2)........(n-2)
`