我正在学习计算机科学入门课程的考试,并且在复杂性主题方面遇到了问题,无论是“常规”算法还是递归算法(通常我们会将这些问题编写为C代码)。 我想知道是否有互联网上的在线示例和/或书籍,以基本水平(不要太基础)涵盖该主题。至少问题的难度应像以下示例练习:
样本练习 alt text http://img42.imageshack.us/img42/4456/ex1j.jpg
样本练习 alt text http://img42.imageshack.us/img42/4456/ex1j.jpg
Cormen、Leiserson和Rivest的《算法导论》是我所知道的最好的通用算法介绍。
Aho、Hopcroft和Ullman的《计算机算法设计与分析》也不错。但相较于《算法导论》,作为入门教材更难以理解......
我喜欢Jon Bentley的《编程珠玑》。每个人都应该阅读它。
我给你的第一个建议是,在理解复杂性之前不要继续学习新主题。至于参考资料,《算法导论》(Cormen)是一个不错的选择。 基本上有三种方法来表达复杂度:大O符号、omega符号和theta符号。 对于迭代算法的复杂度计算非常简单。阅读任何一本书并练习一些例子即可。 对于递归算法,请阅读《Masters定理》。使用这个定理,你可以轻松地计算出大多数递归问题的复杂度。在网上搜索Masters定理,你会找到几个很好的教程。你可以从这里开始 http://en.wikipedia.org/wiki/Master_theorem。
T(n) = aT(n/b) + f(n)
的递归关系。这基本上意味着我们已将问题分解成子问题,每个子问题的大小为n/b。其中f(n)代表将子问题的解组合以获得最终完整解所需的工作量。 - Duleb解决你的练习的正式方式是:
为了验证,请在C语言中执行以下程序(编译器为MinGW2.95):#include <stdio.h>
#include <math.h>
int main() {
int sumIN = 0, sumOUT = 0;
double i, n = 500, j;
double d;
for (i = 1; i <= n; i ++) {
d = 1/(double)i;
j = i;
while (j > 0 && d > 0) {
j -= d;
sumIN ++;
}
sumOUT ++;
}
printf("\nsumIN = %d, sumOUT = %d", sumIN, sumOUT);
printf("\n");
return 0;
}