。
然,这并不是重点。因为很多时候,码农根本用不到算法,就连这些基本的教科书上的算法,我们在平时写代码的时候,都是沉浸在业务的增删改查中。跟算法没有半毛钱关系。尤其是有的面试面的各种红黑树,二叉平衡树,还有经典的kmp算法,字符串匹配问题等等~~然后回到现实中,还是增删改查。这就造成了面试造飞机,工作拧螺丝。导致大部分程序猿谈算法色变,为恐怖之不及。
其实多了解一些算法,其实关键是了解其解题思路。对于培养一个程序猿的思维还是挺有帮助的。程序猿思维应该是由各种各种有趣的逻辑构成码农思维的东西。由各种算法思想构建起来的四维宇宙,而不是一维的坍塌的毫无思维的乱麻。
冒泡(插入、选择)思维:都是一个出发点,遍历比对。
折半查找思维:基于有序的队列,剪枝。减治。每次减少要处理的数据集,一直到小到可以只剩下结果。这种思维常用于在代码定位错误问题的时候会用到。在定位异常的时候,通常会采用折半的操作打断点的方式来快速定位错误地方法。
快排,跟堆排序思维:分治,以及递归。将问题分割成可以处理的最小集,然后将处理好的结果集合成大的结果集。快排实质就是递归,然后合并递归的结果集。堆排序的实质,还涉及一个数据结构。将堆的结构,转变变成可见的数组形式,是PHP程序猿可以理解这种思维的一种福音。
堆就是一种二叉树。然而实际运用中,直接相关的php程序猿应该是B+树。因为MySQL的索引储存就是采用这种模型。为啥是B+树,而不是二叉树,稍微思考一下就能知道,为了减少树高。B+树是多叉树。减少树高的目的,就是加快速度。这里就会涉及到计算机的一个基本原理。IO磁盘操作比内存操作耗时不再一个等级层面。然后这里就可以在MySQL数据索引原理里面,找到B+tree的思想,怎么样快速定位一条数据集的位置。然后这里最后还是会涉及到两个算法:一个二叉树的查找,找到对应的索引的所处的页。然后取出来所在的页的所有数据里面,通过二分查找,来定位于要查找的数据。
以上这些都不重要,知道了也不会加分。但是不知道,还是平时多留意一点,把这些基本的变成一种本能也挺好的。
下面讲一下有趣的算法(关键是一种思维的培养):
1):经典的鸡兔同笼问题。
M个头,N只脚,分别有多少鸡跟兔子。
常规冒泡思维解决,无非是遍历依次比对尝试答案。列方程式求解:
x只鸡,y只兔。
x+y=M;
2x+4y=N;求解这个方程组,就是所需的答案。
鸡贼的解题思路:(程序猿应该培养的思路)
1、让所有的鸡都跟兔子,都抬起两只脚。剩下的脚就只有兔子的脚了。然后剩下的脚除以2就是兔子的数量。
那么求解过程就是:N-2M这个剩下的都是兔子的脚了,然后再除以2(N-2M)/2这个就是兔子的数量。
2):经典的三门问题。
三扇门,只有一扇门后有财宝。任选一扇门,然后有人从另外两扇门中打开一扇没有财宝的门。现在给你重新选的机会。是重新选择剩下那扇门,还是自己选择的那扇门获得财宝的概率高。
直观来看,肯定是一样。第一次选,因为独立事件概率,都是1/3。第二次选,然后从两扇门中获取,概率都是1/2。所有改不改选,概率都应该是一样的。对吗??
貌似无懈可击,但是换个角度就存有大问题。
从另外一个角度看问题:
如果是扇门,只有一扇门中间有财宝。你选择一扇门。然后有人从剩下的99扇门打开了98扇没有财宝的。还剩一扇门。这个时候,你觉得你选择的之前的1/概率大,还是剩下这个99/的概率大?
写代码来校验自己的猜想。
php代码:实验一万次。
是不是猜想,看疗效。结果证实,改变之前的选择,概率比高到1:2.概率是原来的两倍。