本篇笔记分析的是一种特殊地算法设计思想:
根据算法结构和性能的相关定理,从目标性能出发反推出我们能够接受的最终的算法结构,然后按照这些算法结构再去实现算法内部的逻辑。
如果算法的局部是未知的,但是他的架构的性质是已知的。那么我们便可以算法架构出发反过来去设计算法的内部实现逻辑。
特别地,在设计递归算法时,因为有主定理和Akra-Bazzi方法,我们可以简单的、有目的性地设定具有特定递归结构的算法。这是一种自顶向下的设计方法,设定好了大致递归结构后,我们需要根据实际的应用场景去尝试将有意义的步骤填入我们的递归结构之中。
矩阵乘法算法有多种变体,我们希望设计一些基于分治策略的递归算法,来实现矩阵乘法。
矩阵乘法的运算量是固定的,我们设计的递归算法真正递归的地方便是乘法的地方,而不同的递归算法之间的差异仅仅是乘法和加法的数量的差异。但是他们的计算次数总和是相同的。(比如Strassen方法,矩阵乘法只进行了7次,那么他就需要进行更多次的矩阵加法来补偿)。容易发现,加法步骤花费的时间差不多都是(n方),所以我们只需要关心乘法步骤花费的时间即可。
那么到底如何进行设计呢?
从下面3个版本的矩阵乘法递归分治算法的演变我们能看出一点苗头,这些算法的架构基本一样。区别在于partition矩阵之后,如何更加巧妙的组织子矩阵乘法和加法