C 算法的灵活性-练习

C 算法的灵活性-练习,c,time-complexity,C,Time Complexity,我正在为计算机科学入门课程的考试而学习,我对复杂性这个话题有一个问题,无论是“常规”算法还是递归算法(通常我们把这些问题写成C代码)。 我想知道,在互联网和/或书中是否有一些在线示例在基本层面(不太基本)涵盖了该主题。 问题的级别至少与此类似: 示范练习 我在……中找到了一个很好的解释。。。。但是你需要一些数学知识来理解它 麻省理工学院关于渐近符号的算法导论课程的讲座(视频)是。Cormen、Leiserson和Rivest的算法导论是我所知道的最好的算法概论 Aho、Hopcroft和Ullm

我正在为计算机科学入门课程的考试而学习,我对复杂性这个话题有一个问题,无论是“常规”算法还是递归算法(通常我们把这些问题写成C代码)。
我想知道,在互联网和/或书中是否有一些在线示例在基本层面(不太基本)涵盖了该主题。
问题的级别至少与此类似:

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


麻省理工学院关于渐近符号的算法导论课程的讲座(视频)是。

Cormen、Leiserson和Rivest的算法导论是我所知道的最好的算法概论

Aho、Hopcroft和Ullman对计算机算法的设计和分析也很好。但作为一篇介绍性的文章,比算法介绍更难理解


我喜欢乔恩·本特利的《珍珠》节目。每个人都应该读一读。

我还推荐以下麻省理工学院的视频讲座,可从以下网址获得:


祝你好运

我给你的第一个建议是,在你得到答案之前,不要继续讨论新的话题 复杂性部分。至于要查阅的文本,Cormen的算法简介是一个不错的选择。 请看,基本上有三种方式来表示复杂性——大的oh、ω和θ符号。 迭代算法的复杂度计算非常简单。通读任何一本书,练习一些例子。
对于递归算法,请阅读主定理。使用这个定理,您可以轻松地计算大多数递归问题的复杂性。在网上搜索masters定理,你会发现一些不错的教程。你可以从这里开始。

解决练习的正式方法是:

要进行验证,请使用C语言执行以下程序(编译器为MinGW2.95):

#包括
#包括
int main(){
int sumIN=0,sumOUT=0;
双i,n=500,j;
双d;
对于(i=1;i 0&&d>0){
j-=d;
sumIN++;
}
sumOUT++;
}
printf(“\nsumIN=%d,sumOUT=%d”,sumIN,sumOUT);
printf(“\n”);
返回0;
}

你比我领先了30秒。Cormen、Leiserson和Rivest的《算法导论》是我所知道的关于一般算法的最好的导论。实际上,我开始阅读它,它触及了我需要的东西,但很简单,然后阐述了其他东西。我将在那次讲座上分享一下,谢谢。大O符号的介绍很短。但是书中的每一个算法都被彻底地分析了。所以整本书都充满了例子和练习。是不是除了科尔曼的书之外的东西?在看了这本书和我得到的其他链接后,我了解了大O符号,简而言之:2log(3.5n)+2.4的行为与n的log(n)完全一样,n足够大了。我想我会看一看麻省理工学院的讲座,但是如果你有其他的东西,请发到这里。科曼的问题,例如,我主要看到代码分析的最终结果,然后被翻译成O(n)符号,糟糕的是:T(n)=T(2n/3)+1,我知道这最终会给你O(n)=log(n),但是我需要更多的讨论如何从代码本身确定公式(以及迭代算法公式)。也许我弄错了,这本书确实包含了我要找的东西,谢谢你的回答!这是一个递归算法的例子。我的建议是,首先要了解递归是如何工作的,然后再学习马斯特斯定理。Masters定理有三种情况可以解决几乎所有的递归问题。Masters定理涉及的递归关系形式为:T(n)=aT(n/b)+f(n)。这基本上意味着我们将问题分解为一个子问题,每个子问题的大小为n/b。这里是f(n)表示组合子问题的解决方案以获得最终完整解决方案所需的工作。
#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;
}