谈谈算法
让编程改变世界
Change the world by program
谈谈算法
我们这门课程叫“数据结构和算法”,有鱼油可能会问这不是两门课程呢?为什么整在一起讲解呢?不是徒增我们的思想负担吗? 矮油,这看来小甲鱼是有必要跟大家解释一下数据结构和算法的关系啦。 打个比方,其实数据结构和算法的关系就比好基友是一辈子的关系。 他们患难见真情,他们生死不相弃,他们荣辱与共,他们一生情一辈子…… 事实上,数据结构和算法也有类似的关系。只谈数据结构,我们可以在很短的时间内就把几种重要的数据结构介绍完。 不过听完后,你可能没啥感觉,不知道这些数据结构有啥用处。 但如果我们把相应的算法结合起来讲一讲,演示一下,你就会发现,甚至开始感慨:O,原来小甲鱼以及计算机界的前辈们,的确是一些很牛很牛的人,他们的工作使很多看似很难解决的问题变得如此美妙和神奇A。算法初体验
小学学过珠算的鱼油应该很有印象,每天加法运算敲得手指都快断了就算那1+2+…+99+100。 这会儿,小甲鱼就给大家介绍一个有关也是有关从1加到100的小故事作为开端吧! 很久很久很久以前…… 有部分淘气的鱼油可能不屑一顾,切,我们刚开始学习小甲鱼你的《零基础入门学习C语言》的时候,早就教过我们用C来写1加到100的代码咯。 那时候你还说咱计算机的速度是何其快啊! [codesyntax lang="c"]int i, sum = 0, n = 100; for(i=1; i <= n; i++) { sum = sum + i; } printf(“%d”, sum);[/codesyntax] 对比下,用高斯先生的算法,我们可以这么写: [codesyntax lang="c"]
int i, sum = 0, n = 100; sum = (1+n)*n/2; printf(“%d”, sum);[/codesyntax] 可能以计算机的神速,两个算法都可以秒杀解决掉! 但是,如果我们把条件换成1加到1千万,或者1加到1千亿,差距就可想而知了,甚至人脑都可以比电脑计算得快了。
那么什么是算法呢?
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 懵了吧?用小甲鱼的话来讲,算法就是你泡妞儿的技巧和方式。 从刚才的例子中我们看到,对于给定的问题,是可以有多种算法来解决的。 这就像追女孩子,总不可能每个人追女孩子的方式都一样吧? 举个例子,小甲鱼常常在街上看到很多美眉,但旁边都是挽着条件十分一般的男朋友。 这时候,小甲鱼就会由衷的佩服该男同胞一定是用了特别牛掰的算法追到美眉的! 就像没有药可以包治百病一样,一个问题可以由多个算法解决,一个算法也不可能具有通解所有问题的能力。 考虑到大部分学习小甲鱼《数据结构和算法》的鱼油都是学生,都要对付各种考试和考核。 注意,小甲鱼这里用了“对付”而不是“应付”,虽然是填鸭式教育,但是,如果我们能从中学到有用的知识并且可以对付考试,是最好的! 所以小甲鱼这个系列的视频教程也是针对性的要把经常考试的概念提一提说一说谈一谈侃一侃。算法的特征
嗯,算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。输入
算法具有零个或多个输入。 尽管对于绝大多数算法来说,输入参数都是必要的。但是有些时候,像打印“I love fishc.com”,就不需要啥参数啦。 [codesyntax lang="c"]void print() { printf(“I love fishc.comn”); }[/codesyntax]
输出
算法至少有一个或多个输出。 算法是一定要输出的,不需要它输出,那你要这个算法来干啥? 输出的形式可以是打印形式输出,也可以是返回一个值或多个值等。有穷性
指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。 一个永远都不会结束的算法,我们还要他来干啥?确定性
算法的每一个步骤都具有确定的含义,不会出现二义性。 算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。 算法的每个步骤都应该被精确定义而无歧义。可行性
算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。算法设计的要求
刚才我们谈到了,算法并不是唯一的。 也就是说同一个问题,可以有多种解决问题的算法。 这可能让那些常年只做有标准答案题目的童鞋失望了,他们多么希望存在标准答案,因为只有一个正确的,把它背下来万事大吉! 但是咱的算法是变幻无穷的,还记得我们刚才讲过的高斯童鞋吗? 世界上要多几个这样的鱼油,那又会有多几种牛掰的算法哈。 尽管算法不唯一,但我们要学习掌握一些好的算法,对我们解决问题很有帮助!正确性
算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。 大体分为以下四个层次:- 算法程序没有语法错误。
- 算法程序对于合法输入能够产生满足要求的输出。
- 算法程序对于非法输入能够产生满足规格的说明。
- 算法程序对于故意刁难的测试输入都有满足要求的输出结果。