4

我正在学习计算机科学入门课程的考试,并且在“常规”算法和递归算法(通常我们将这些问题编写为 C 代码)中,我都对复杂性主题有疑问。
我想知道互联网和/或书籍中是否有在线示例涵盖基本级别(不是太基本)的主题。
问题的级别至少像这样:

示例练习 alt text http://img42.imageshack.us/img42/4456/ex1j.jpg

4

5 回答 5

3

我在Introduction to Algorithms中找到了一个很好的解释……但是你需要一些数学知识来理解它。

麻省理工学院算法介绍课程关于渐近符号的讲座(视频)在这里

于 2009-09-01T07:29:56.530 回答
1

我还建议关注麻省理工学院的这些视频讲座,网址为:http ://academicearth.org/courses/introduction-to-algorithms 。

祝你好运!

于 2009-09-01T07:59:03.040 回答
1

Cormen、Leiserson 和 Rivest 的《算法简介》是我所知道的对算法的最佳一般简介。

Aho、Hopcroft 和 Ullman 的计算机算法设计和分析也不错。但作为介绍性文本比算法介绍更难消化......

我喜欢 Jon Bentley 的 Programming Pearls。每个人都应该阅读它。

于 2009-09-01T07:37:20.557 回答
0

我对您的第一个建议是,在您了解复杂性部分之前,不要进入新主题。至于要参考的文字,Cormen 的 Introduction to Algorithm是一个不错的选择。看到基本上有三种方式来表达复杂性 Big-oh、omega 和 theta 符号。迭代算法的复杂度计算非常简单。阅读任何一本书并练习一些例子。对于递归算法,请阅读Masters theorem。使用这个定理,您可以轻松计算大多数递归问题的复杂性。在网上搜索大师定理,你会发现几个很好的教程。你可以从这里开始http://en.wikipedia.org/wiki/Master_theorem

于 2009-09-01T08:11:38.490 回答
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;
}
于 2014-03-16T20:47:52.860 回答