乙個簡單的分治演算法求矩陣相乘
c=a * b ,假設三個矩陣均為n×n,n為2的冪。可以對其分解為4個n/2×n/2的子矩陣分別遞迴求解:
遞迴分治演算法:
演算法中乙個重要的細節就是在分塊的時候,採用的是下標的方式。
#include
#include
#define row 16 //指定 行數
#define col 16 //指定 列數
int a[row][col],b[row][col]; //矩陣a 和 矩陣b
int **c; // c = a * b
//儲存乙個矩陣的第乙個元素的位置,即左上角元素的下標
//如果加上乙個長度就可以知道整個矩陣了
typedef struct subarr;
// 兩矩陣arr、brr相加減 儲存在temp中
void operate(int **arr,int **brr,subarr te,char op,int **temp,int len);
//分治法 求矩陣相乘 ,sa,sb分別為矩陣a,b參加運算的首元素
int ** square_recursive(subarr sa,subarr sb,subarr sc,int len)
// 長度為1 則直接相乘
if (n==1)
else
return temp;
}// temp矩陣的te位置(四個子塊中的乙個)=arr+brr
// len表示arr,brr參加運算的長度
// op是運算子 『+』
void operate(int **arr,int **brr,subarr te,char op,int **temp,int len)
}break;
case
'-':
for (i=0;ifor (j = 0; j < len; ++j)
}break;
}}//為矩陣初始化 即賦值
void createarr(int temp[col])
}}// 列印c矩陣
void print()
printf("\n");
}printf("***********************************\n");
}// 列印矩陣
void printarray(int a[row][col])
printf("\n");
}printf("-----------------------\n");
}int main()
// 給矩陣a,b 複製初始化
createarr(a);
createarr(b);
// 進行運算
c=square_recursive(sa,sb,sc,len);
// 列印矩陣a,b,c
printarray(a);
printarray(b);
print();
return
0;}
分治法 大整數相乘
大整數相乘 a b兩個整數,a有n位 123456 n b有m位 123456 m 一般的思路是像最初學習乘法時一樣逐位相乘後相加,但是這樣做演算法的複雜度過高,但這仍然是解題的基本思想。既然提到分治,那麼如何分,怎麼治?能夠找到乙個大問題劃分為小問題方法的重要技巧是能夠看到大問題的規模和所謂規模的...
大整數相乘 分治法(JS)
相乘的基本原理 如 1234 567第一步 分解 234 12 和 34 567 5 和 67 第二步 分別計算 首部 12 5 60 中部 12 67 34 5 974 尾部 34 67 2278第三步 進製 因為是以兩位數字分割的,所以進製是滿100進一位 尾部 留78,進22,即78 中部 9...
分治法 大數相乘(演算法001)
兩個長為n bit的數x和y相乘。我們可以將數分為長為n 2 bit的前後兩部分,分別相乘。x y 2n 2xl xr 2n 2yl yr 2nxlyl 2n 2 xlyr xryl xryr 2nxlyl 2n 2 xl xr yl yr xlyl xryr xryr 公式如上,xl,yl,xr,...