首先先写一个两个矩阵相乘的代码:
注意边界限制。
public static int[][] twoMatrixPlus(int x [][],int y [][]) {//两个矩阵相乘,具有普适性
int ans[][]=new int[x.length][y[0].length];
for(int i=0;i<ans.length;i++)
for(int j=0;j<ans[0].length;j++) {
ans[i][j]=0;
}//初始化
for(int i=0;i<x.length;i++)
for(int j=0;j<y[0].length;j++)
for(int p=0;p<x[0].length;p++)
ans[i][j]+=x[i][p]*y[p][j];
return ans;
}
通过不断调用上面方法求N次方的复杂度为O(n)。
而用快速幂的方法实现N次幂的复杂度为O(logN)。
下面实现方法以及测试代码如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] array= {{1,2},{3,4}};
for(int i=0;i<array.length;i++)
for(int j=0;j<array[0].length;j++) {
System.out.println(array[i][j]);
}
int [][] b=matrixPower(array,3);
System.out.println("********************");
for(int i=0;i<b.length;i++)
for(int j=0;j<b[0].length;j++) {
System.out.println(b[i][j]);
}
}
public static int[][] matrixPower(int a[][],int n){
int ans[][]=new int[a.length][a[0].length];
for(int i=0;i<ans.length;i++)
for(int j=0;j<ans[0].length;j++) {
if(i==j)
ans[i][j]=1;
else
ans[i][j]=0;
}//初始化为单位矩阵
while(n!=0) {
if((n&1)==1)
ans=twoMatrixPlus(ans,a);
a=twoMatrixPlus(a,a);
n=n>>1;
}
return ans;
}
我觉得矩阵初始化为单位矩阵那里应该还能优化(比如已知某方阵,可以在主函数部分先声明一个,
在主函数部分初始化,再把它作为参数传进来,这样多次调用较适用),暂时还没想出更好的办法解决。
运行结果如下: