• 在学校的同学们之间,算法总是被放在一个非常高的位置,有多高呢?嗯...就是非常非常高啦,高到有人只要能说出几个非常牛掰的和算法有关的名词,比如NP完全问题啦、模拟退火啦就觉得自己是大神了(其实有些人连快排都写不出来,或者写个快排还要先翻翻书)。其实我觉得算法跟数据结构、设计模式一样,都只是一种工具,用这样的工具能快速有效地解决一些实际问题,如果只知道算法,而不懂这些算法能够用于哪些场景,那么这些算法在这些人的大脑中是没有什么意义的。
    根据我的经验,算法对于大一的学生是“那个人算法很厉害,大神大神”,对于大二"你听说过模拟退火过没?你听说过遗传算法没?你听说过反馈神经网络没?现在的AI算法可以......",对于大三"嗯,算法很重要,以后工作有比没有好,工作中经常用到,平时有空闲的时间多研究研究,对未来的成长大大的有好处"。
    算法其实就是对一个问题或一类问题的解决过程的描述。比如说用加法求1加到100,那么就可以用

    count=0
    for i in 1...100
    count += i

  • 来描述。这个描述的过程就是不断的累加。算法非常关注于复杂度,也就是时间复杂度和空间复杂度。有些算法可以让时间用得尽量少,而有些算法为了节约空间,会用牺牲时间的方式来换取少用空间。不过,由于现在的物理储存设备的空间越来越大,空间暂时不是非常重要,除非在一些特殊的场景,比如说在大规模数据的情况下。当数据只有1M的时候,空间增加100倍没有什么很大的问题,但是如果数据有1T的话,再增加100倍后的数据量,是很难让人接受的。对于一个算法,我们经常需要在时间和空间之间进行取舍。
    算法跟程序不同,算法是对一个问题解决过程的描述,需要有0个或多个输入,至少1个输出,每个过程都是确定的,并且一定要有有限的时间内完成。但程序就不一定,有些程序可以一直运行下去,只有一直给机器供电,程序一直不出现致命错误。
    算法也可以一种模型,数据结构是对数据储存的模型,而算法是对问题解决过程的模型。数据结构是为了更方便的储存和访问数据,算法是为了更有效率地处理数据。所以算法和数据结构是不分家的,没有数据结构,算法根本没有数据可以操作,算法也无法进行,而没有算法,数据结构光储存有数据,这些数据不经处理,也大部分是无用的。
    经过无数计算机算法前辈的研究,已经有非常多现成的算法供我们学习和使用。算法并非是计算机专有的,或者说算法的思想来源于很多其他行业。比如说前面说到的模拟退火算法。算法还涉及到了很多微积分、线性代数、离散数学、概率论、博弈论、数论方面的知识。

Q.E.D.