我正在计算机科学的入门课程中学习考试,我在复杂性问题上遇到了问题,无论是“常规”算法还是递归算法(通常我们将这些问题写成C代码) )。
我想知道在互联网和/或书中的某个地方是否存在基本示例,这些示例涵盖了基本级别(不太基本)的主题。
问题的级别至少如下:(
样本锻炼
alt text http://img42.imageshack.us/img42/4456/ex1j.jpg
答案 0 :(得分:3)
我在Introduction to Algorithms中找到了一个非常好的解释....但你需要一些数学知识来理解它。
麻省理工学院关于渐近符号的算法导论课程的讲座(视频)是here。
答案 1 :(得分:1)
Cormen,Leiserson和Rivest的算法简介是我所知道算法的最佳一般介绍。
Aho,Hopcroft和Ullman的计算机算法设计和分析也很好。但比介绍算法更难以作为介绍性文本消化......
我喜欢Jon Bentley的Programming Pearls。每个人都应该阅读它。
答案 2 :(得分:1)
我还建议您参加麻省理工学院的这些视频讲座,地址为:http://academicearth.org/courses/introduction-to-algorithms。
祝你好运!
答案 3 :(得分:0)
我对你的第一个建议是,在你获得新主题之前不要继续前进 复杂性部分。至于要咨询的文本, Cormen的算法简介是一个不错的选择。 看基本上有三种方式表达复杂性大哦,欧米茄和theta符号。 迭代算法的复杂度计算非常简单。阅读任何书籍并练习一些例子。 对于递归算法,请阅读 Masters定理。使用此定理,您可以轻松计算大多数递归问题的复杂性。在网上搜索大师定理,你会发现几个很好的教程。你可以从这里开始http://en.wikipedia.org/wiki/Master_theorem。
答案 4 :(得分:0)
解决锻炼的正式方法是:
要验证,请用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;
}