什么是算法
虽然这篇题目叫概述,不过本菜只是不知道该叫什么好,我这种小白肿么敢概述算法是不。就是总体上说说我对算法的理解吧 O_o
算法可能有些初学童鞋接触过。有些地方高中教材里会涉及到(江苏是有的)。《算法导论》给出了一个定义:
所谓算法就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个 或一组值作为输出。亦即,算法就是一系列的计算步骤,用来将输入数据转换成输出结果。
除此之外,《算法导论》又说
可将算法看作一种工具,用来解决一个具有良好规格说明的计算问题。有关该问题的表述可以用通用的语言,来规定所需的输入/输出关系。与之对应的算法则描述了一个特定的计算过程,用于实现这一输入/输出关系。
看起来有点抽象是伐~那我们来举个栗子。咱们打牌的时候会有这样的一种理牌方式,把所有牌从小到大排列(神理牌的高手奏凯!!)。一副牌,两副牌……估计多少副牌大家都能够理出来。那我们来分析一下这个例子跟算法有毛线关系。我们对照《导论》第一个说法来看:
良好的计算过程就是咱们摸到牌之后把牌放到正确位置的过程(比如这么说:第一步摸牌,第二步从小到大依次看牌,找到一个位置满足左边的牌小于等于刚摸到的牌,同时右边的牌大于等于刚摸到的牌,第三步:猛插进去!),我们的取值是——数量不限的扑克,而产生的输出则是——排序好的一把牌(我凑!王炸!)。
而对照第二个说法再看:
良好规格说明的计算问题显然就是要把牌从小到大排好(当然这个描述很不严谨,时间关系大家明白就好),刚刚的说明规定了输入和输出的关系。而上面设计好的算法则可以实现这个过程。
算法评价
那我们就应该有一个疑问,怎么去评判算法呢?一般要看几个方面:算法正确性、算法占用的时空资源。
算法的正确性顾名思义,对于所有的数据输入,都能在有限步之内得到完全正确的输出。也就是说,一个错误算法,可能在某些输入是根本不会停止,也可能给出的输出并不是正确的输出。不过对于一些难问题(NP 、NP完全)来说,我们不一定只采取正确算法,如果有些算法的错误率可以得到很好的控制,我们也是可以在实际应用的时候采用的。
算法占用的资源分为两类,一是时间,二是空间。前者我们认为是考虑算法的效率当然简单的算法我们可以很清地预测算法的每一步从而算出时间,不过,有的时候非常复杂的算法你可能不能很精确地算出时间(或者说算法需要的步数),不过我们可以用一些数学工具来计算,这个计算方法我就不在这讲了,昊昊自己对这个也只能说是了解了原理,具体判断还是靠背各种算法的效率。至于占用的空间,应该很好理解,不过我至今还木有考虑过空间T T,真是不合格的程序猿……
数据结构
在这说算法,不得不提到数据结构。算法+数据结构=程序。Pascal之父 Nicklaus Wirth就因为这一句话获得了图灵奖。由此可见算法跟数据结构的紧密联系。不同的算法要有适合的数据结构配合才能发挥最佳的性能。而我们常见的数据结构有:栈、队列、链表、散列表、树、图、bla bla~~~作为一枚程序猿我们必须掌握普通数据结构各个细节,了解它们的特性,以便在我们实际应用的时候灵活地选择。
先拿栈和队列对比一下。
栈:先进后出。队列:先进先出。这两个比较类似,我举个栗子。比如羽毛球筒,它就可以看作一个队列。用完的球从筒屁股那塞进去,而要用的时候从前面取(请大家嫑邪恶 ¯﹃¯)。也就是最先放进去的球最先被取出。而如果哪天发现一端坏掉了,只能从另一端取球,放球(虽然羽毛球不能这样,但这只是个栗子,栗子。。。。),大家可以想象,最后一次放进去的球在下一次取球时会被第一次取出来。
根据这些不同,我们在编程的时候,有时会选择栈,有时会选择队列。以后再细说~
说在最后:
第一篇的内容属于概括性的描述,是让大家能够了解算法是什么,算法怎样判断好坏,以及与算法息息相关的数据结构。这部分并不是毫无作用,随着大家学习的深入,会逐步体会到的,只可意会不可言传哈~码字不容易~