算法小结
1、算法
简单来说,算法是个厘清思路的过程,首先找运算逻辑,其次找准逻辑的基准点,就是突破口。
比如排序,基础排序都有两次循环,外层循环用来确定循环边界,内层循环用来确定排序逻辑。确定两层循环的运算逻辑,基准点就是内层循环,内外相辅相成遂出现了十多种排序。
又比如链表,运算逻辑都是由一个节点通过指针找到其他节点的过程。包括链表运算,二叉树运算、堆栈队列等,基准点无非是链表的基准操作,断开再链接、遍历等等。
2、数据结构
上述的基本操作都是由数据结构带来的,学算法必须掌握的基准点就是数据结构的简单特性。
因此数据结构,学特性。
数据结构就两种,一种是顺序结构,也叫线性结构。顺序结构的特性是知道一个数的位置,根据偏移量计算就能找到后面数的位置。排序一般是顺序结构的运算,比如排序中用到的数组,arr[6]=6,如果这个位置往前数第5个数,arr[1]就能表示出来,所以这个特性经常用来做数的交换操作。
另一种结构是跳转结构,是非线性的。跳转结构的特点是根据一个节点的位置,通过通用的指针(比如next指针,具体指针看节点的定义)可以查到这个链表后面所有点的内容。堆栈队列结构一般是跳转结构,因为堆栈的特性只需要写好进出规则,按顺序就能拿出所有数,中间有什么数。
所以就很明显能看出来,顺序结构的特性是方便寻址,而跳转结构,是方便增删的。
想知道是什么数据结构上的操作,只需要看看用到的高等语言中的数据采用那种数据结构就行了。而数据结构的特性是固定的,所有高等语言都通用。
3、设计模式
数据结构是细节,由细节到宏观组成的算法,宏观点的是什么呢?是设计模式。各种设计模式的排列组合,形成一个个算法,常说的设计模式有23种,常用到的也不过几种,往往我们实际用的也不是正经设计模式,只运用设计模式的一部分就能解决问题。
设计模式再细解抽象,就是程序结构,所有的程序结构都只有三种,顺序、分支、循环。比如代码从上到下执行是顺序,运行过程中调用第三方是分支,固定的在顺序中调用第三方是循环。
甚至所有事情的处理都是这三种模式,要么是顺着思路走能解决一类问题,要么是另辟蹊径解决能解决另一类问题,而顺着某个思路固定形式的另辟蹊径能解决更多类问题,而这三种思路组合能解决所有问题,多复杂的问题细解下来也是这三种思路。
设计模式的精妙就在于什么地方顺序走、什么地方引入分支、再在什么地方展开循环。
所以设计模式,学思路。
4、总结
这样一厘清,算法的基础就很清晰了。它就是个对学习者思维模式的训练,熟能生巧。熟练度就是对算法的掌控力。
脉络清了,枝干简练,遇到问题就很容易自我诊断出是哪块不熟悉,把不熟悉的多思考总结几遍,心里有数,才不会生出很多畏难情绪。
等基础掌握的牢牢的,再看算法,就转换成了一道道数学题。而数学呢,是简洁而优美的。思路清,我们的代码也会简洁而优美。