1、算法

简单来说,算法是个厘清思路的过程,首先找运算逻辑,其次找准逻辑的基准点,就是突破口。

比如排序,基础排序都有两次循环,外层循环用来确定循环边界,内层循环用来确定排序逻辑。确定两层循环的运算逻辑,基准点就是内层循环,内外相辅相成遂出现了十多种排序。

又比如链表,运算逻辑都是由一个节点通过指针找到其他节点的过程。包括链表运算,二叉树运算、堆栈队列等,基准点无非是链表的基准操作,断开再链接、遍历等等。

2、数据结构

上述的基本操作都是由数据结构带来的,学算法必须掌握的基准点就是数据结构的简单特性。

因此数据结构,学特性。

数据结构就两种,一种是顺序结构,也叫线性结构。顺序结构的特性是知道一个数的位置,根据偏移量计算就能找到后面数的位置。排序一般是顺序结构的运算,比如排序中用到的数组,arr[6]=6,如果这个位置往前数第5个数,arr[1]就能表示出来,所以这个特性经常用来做数的交换操作。

另一种结构是跳转结构,是非线性的。跳转结构的特点是根据一个节点的位置,通过通用的指针(比如next指针,具体指针看节点的定义)可以查到这个链表后面所有点的内容。堆栈队列结构一般是跳转结构,因为堆栈的特性只需要写好进出规则,按顺序就能拿出所有数,中间有什么数。

所以就很明显能看出来,顺序结构的特性是方便寻址,而跳转结构,是方便增删的。

想知道是什么数据结构上的操作,只需要看看用到的高等语言中的数据采用那种数据结构就行了。而数据结构的特性是固定的,所有高等语言都通用。

3、设计模式

数据结构是细节,由细节到宏观组成的算法,宏观点的是什么呢?是设计模式。各种设计模式的排列组合,形成一个个算法,常说的设计模式有23种,常用到的也不过几种,往往我们实际用的也不是正经设计模式,只运用设计模式的一部分就能解决问题。

设计模式再细解抽象,就是程序结构,所有的程序结构都只有三种,顺序、分支、循环。比如代码从上到下执行是顺序,运行过程中调用第三方是分支,固定的在顺序中调用第三方是循环。

甚至所有事情的处理都是这三种模式,要么是顺着思路走能解决一类问题,要么是另辟蹊径解决能解决另一类问题,而顺着某个思路固定形式的另辟蹊径能解决更多类问题,而这三种思路组合能解决所有问题,多复杂的问题细解下来也是这三种思路。

设计模式的精妙就在于什么地方顺序走、什么地方引入分支、再在什么地方展开循环。

所以设计模式,学思路。

4、总结

这样一厘清,算法的基础就很清晰了。它就是个对学习者思维模式的训练,熟能生巧。熟练度就是对算法的掌控力。

脉络清了,枝干简练,遇到问题就很容易自我诊断出是哪块不熟悉,把不熟悉的多思考总结几遍,心里有数,才不会生出很多畏难情绪。

等基础掌握的牢牢的,再看算法,就转换成了一道道数学题。而数学呢,是简洁而优美的。思路清,我们的代码也会简洁而优美。