Algorithm 跟踪算法的运行时复杂性
给定一个多达10000个整数的序列(0Algorithm 跟踪算法的运行时复杂性,algorithm,time-complexity,Algorithm,Time Complexity,给定一个多达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)
`