算法的复杂性 - 练习

时间:2009-09-01 07:23:06

标签: c time-complexity

我正在计算机科学的入门课程中学习考试,我在复杂性问题上遇到了问题,无论是“常规”算法还是递归算法(通常我们将这些问题写成C代码) )。
我想知道在互联网和/或书中的某个地方是否存在基本示例,这些示例涵盖了基本级别(不太基本)的主题。 问题的级别至少如下:(
样本锻炼 alt text http://img42.imageshack.us/img42/4456/ex1j.jpg

5 个答案:

答案 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)

解决锻炼的正式方法是:

enter image description here

要验证,请用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;
}