从昨天的Sorting动图和思路中,可以看到,每种排序算法都有各自的特点,其中我最感兴趣的是Merge Sort,就是归并排序,它将规模为N的序列拆分出若干子序列,这样,每个子序列只需要进行小规模的排序即可,减少了总的运算次数,提高了算法效率。而Merge Sort也用到了算法中非常重要的一个分治思想。
分治思想分三步,第一步是Divide,把问题拆为子问题;第二步用同样的算法来递归子问题;第三步是将所有已解决的子问题合并至一起。
在MIT的网易公开课《算法导论》中,有一次课专门讲到分治方法。同时,除了Merge Sort的例子,更重要的是其他问题的解决,比如二分法查找,在一个长度为N的非递减的序列中,如何快速找到x的位置,朴素算法是逐个比较。而二分法是先取中间元素与x进行比较,如果x<中间元素,则说明x在1 to N/2之间,这时右半边可以完全排除。T(n)=1*T(n/2)+θ(1)。
第三个例子是计算x的n次方,把它分为x的n/2次方与x的n/2次方相乘即可。当然,要对n的奇偶进行分开讨论,但总的算法时间为T(n)=2*T(n/2)+θ(1)。这样n/2个x相乘的次数就少一半,节约时间。
第四个例子是计算斐波契那数列简称F(n)的第n项的数值,开始几项是1,1,2,3,5,。。。。,每一项是前两项的和,如果按照数列定义计算,会很麻烦。后面有人证明得出,Fn项满足(1 1 1 0)的2X2矩阵的n次方,根据这个定理,我们可以把计算Fn变成进行矩阵乘法的运算。与第三个例子类似。但仍然不够效率。
后来有一个叫Stcassen的人提供了一个解法,把乘法变成了7个子问题,然后分别计算后再得出最终矩阵的4项。具体方法见维基百科。
接下来会继续进行一些经典算法的学习,并结合实际问题把它们全部代码化,请大家继续关注.