前几日在地铁上和好友讨论起MySQL数据库,由于MySQL数据库不支持复合类型变量,就想到能否用MySQL去实现一些算法呢。最近在学习MySql存储程序,昨天闲来无事,就动手写写吧,借此巩固一下存储过程的用法。
这次要用MySQL实现的算法是矩阵快速幂,并借此解决斐波那契数列问题,首先我们要简单普及一下基本知识。一,菲波那切数列。即我们熟知的兔子繁殖问题,菲波那切数列的数学表达式:F(n) = F(n-1)+F(n-2),(n>2,F(1)=F(2)=1);第n项为前两项之和。二,快速幂。顾名思义幂运算的快速实现,对于普通的a的b次幂运算,需要进行b次乘法运算,而快速幂只用log2(b)级别的次数就可以做到。至于算法原理这里就不再赘述。三,矩阵乘法运算。线性代数里面的知识。这里只使用公式表达一下。A(x,y) = A(x,y)+B(x,z)*C(z,y);四,矩阵快速幂。其实就是对于矩阵A的b次幂,采用快速幂的原理实现而已。
好了,下面我们就开始用MySQL实现矩阵快速幂。但是迎面而来的问题是,MySQL不支持复合类型,而我们需要用二位数组来实现矩阵的表示,并进行乘法运算。想到这里,你恐怕感觉无法实现了,但是我们有一个变通的方案可用,我们可以用数据表去充当一维的数组,使用自增的id用来标识第几个元素。既然有了一维数组,那我们完全可以用一维数组去充当二维数组啊,只需对下标进行适当的转换就行了。下标id是用1开始递增的,所以转换规则可以这样表示 A(x,y)=A((x-1)*len+y),(len为数组维度的长度),将二维下标转换成一维下标。数据类型的问题已经解决,那我们就首先实现矩阵相乘。首先我们要做的就是创建三张表(matrix,matrix_a,matrix_b)用来存储数据,数据表结构如下:
DROP TABLE IF EXISTS matrix;
CREATE TABLE matrix(
id INT(11) NOT NULL AUTO_INCREMENT,
val INT(11) DEFAULT NULL,
PRIMARY KEY (id)
);
由于MySQL的函数不支持数据表的操作,我们只能借用存储过程来实现。把两个表名以字符串的形式传递进去&