在乙個矩陣中,如果非0元素遠遠少於0元素,那麼這個矩陣就是稀疏矩陣,在實際應用中,計算機會耗費大量的空間儲存這些無意義的0元素,如果能夠壓縮一下,將會減少計算機的開銷。本篇文章以五子棋的棋局儲存為背景,用c語言實現原始稀疏矩陣轉換為壓縮矩陣並且儲存為檔案,棋局覆盤則讀取檔案將壓縮矩陣轉換為原始稀疏矩陣。
假如有如下棋局,如果要儲存,可以用1來表示紅棋子,2來表示黑棋子,0表示無棋子。
需求就是將上述棋局轉換為如下矩陣
棋局儲存:1、統計有多少個有效元素count
2、定義長度為count+1,寬度為3的矩陣arr
3、逐一賦值,存入檔案
棋局覆盤:1、讀取檔案第一行,得到原始矩陣的行列數,定義原始矩陣
2、將檔案中對應的非0值賦值給原始矩陣
#include #include #define len 6
/**求輸出稀疏矩陣
*/void showarr(int *arr, int row,int col)
}/**
求輸出原始方陣
*/void showoldarr(int arr[len])
if(j == len) printf("\n"); }}
/**求有效元素個數
*/int arrnum(int arr[len])
} return count;
}int main(),,};
//1表示白棋子,2表示黑棋子,0表示無棋子
printf("原始矩陣:\n");
showoldarr(oldarr);
//得到有效資料的個數,確定稀疏矩陣的行數
int num = arrnum(oldarr);
int row = num+1;
int col = 3;
//建立稀疏矩陣,因為c語言中的二維陣列長度不能含有變數,所以用指標的指標來定義
int *newarr;
newarr=(int *)malloc(sizeof(int)*(num+1)*3);
//先給稀疏矩陣的第一行賦值
*newarr = len;
*(newarr+1) = len;
*(newarr+2) = num;
//再給剩下的行賦值
for(i = 3 ; i < row*col ; i+=3)
}k+=1;
break;
}} printf("稀疏矩陣:\n");
showarr(newarr,row,col);
//將矩陣寫入檔案
file *p=fopen("arr.txt","w");
for(i = 0 ; i < row*col ;)
fclose(p);
}
棋局儲存執行結果
輸出原始陣列
*/void showarr(int *arr, int row,int col)
}int main(){
char line[256];
file *f = fopen("arr.txt", "rb");
//先讀第一行
fgets(line, 256, f);
int ele = atoi(line);
char rlen =ele/100; //得到矩陣長度
char clen =ele/10%10; //得到矩陣寬度
int *arr; //定義乙個空間來放原始矩陣
arr = (int *)malloc(sizeof(int)*rlen*clen);//根據矩陣長度寬度開闢空間
c語言中,陣列的長度定義不可以為變數,必須是常量,因此這裡便用指標開闢空間來代替二維陣列,實際上二維陣列的物理記憶體和一位陣列一樣,都是線性儲存,因此實質上是一樣的。指標的取值怎麼取也是容易出錯的地方,如果寫錯表示式,會出現程式停止。
C 實現稀疏矩陣的壓縮儲存例項
什麼是稀疏矩陣呢,就是在m n的矩陣中,有效值的個數遠小於無效值的個數,並且這些資料的分布沒有規律。在壓縮儲存稀疏矩陣的時候我們只儲存極少數的有效資料。我們在這裡使用三元組儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後次序依次存放。下面我們來看一下 實現。include include...
稀疏矩陣的壓縮儲存
include include using namespace std templateclass sparsematrix sparsematrix 訪問稀疏矩陣中row行col中的元素 t access int row,int col it return invalid for size t i...
稀疏矩陣的壓縮儲存
稀疏矩陣的壓縮儲存 實現稀疏矩陣壓縮儲存,並實現矩陣轉置和求和。輸入矩陣時,首先需要輸入非零元素的個數,然後分別輸入矩陣的 行號,列號和值。輸完2個矩陣後,自動進行計算第乙個矩陣的轉置以及兩個矩陣的和。例如 輸入如下 100 90 5 矩陣的行數為100,列數為90,共5個非零元素。1 10 100...