如有疑問可加QQ:936285470,交流技術扯淡都可以
前兩天朋友讓幫忙寫一個論文裏面的矩陣拆分算法,大概的意思就是有一個m×n的矩陣,給定一個整數k,然後按照k的 值將矩陣拆分成m×k的矩陣,求所有的方案。
看了之後想了一下,最簡單的排列組合算法嘛,就去百度了一段排列組合代碼下來改(不想手寫你懂得)
後面找到了一個排列組合寫的還不錯的博,我這裏面有一部門代碼用的也是他的,大家如果覺得我寫的看不懂的話可以去看看他的
地址:http://www.cnblogs.com/luxiaoxun/archive/2012/08/08/2628153.html
排列組合算法的遞歸實現:
/**
* 排列組合函數
*a[] 將要拆分的矩陣的列號按順序排列的數組
*b[] a數組的標記輔助數組
*start a數組的開始位置
*end a數組的結束位置
*/
void combine(int a[], boolean b[], int start, int end)
{
int columnArr[]=new int[a.length]; //子矩陣所包含大矩陣哪幾列的記錄數組
if(start > end)
{
for(int i = 0; i <= end; ++i)
{
if(b[i]){
System.out.print(a[i] + " ");
columnArr[i]=1;
} }
System.out.println();
} else { b[start] = true; combine(a,b,start+1,end); b[start] = false; combine(a,b,start+1,end); } }
上面的函數可以把給定的數組拆分成若干個長度不一的子數組,並且輸出所有的方案。
下面我改進了一下上面的函數,控制了子數組的長度,就得到了我想要的矩陣拆分函數。
/** * 矩陣拆分函數 *a[] 將要拆分的矩陣的列號按順序排列的數組 *b[] a數組的標記輔助數組 *start a數組的開始位置 *end a數組的結束位置 *k 子矩陣的列數 */ void combine(int a[], boolean b[], int start, int end,int k) { int columnArr[]=new int[a.length]; //子矩陣所包含大矩陣哪幾列的記錄數組 if(start > end) { int count=0; for(int i = 0; i <= end; ++i) { if(b[i]) count++; } if(count==k){ //對子數組的長度按照k進行控制 for(int i = 0; i <= end; ++i) { if(b[i]) { System.out.print(a[i] + " "); columnArr[i]=1; } } System.out.println(); } } else { b[start] = true; combine(a,b,start+1,end,k,matrixClassArr); b[start] = false; combine(a,b,start+1,end,k,matrixClassArr); } }
拆分完成後,按照得到的columnArr數組,就可以拿去拆分大矩陣了。
第一篇博客,寫的不好大家多多見諒。後面還會把多年來積累的葵花寶典慢慢放到博客來,希望大家多多支持。