作者zhonglihao
演算法名稀疏矩陣乘法 sparse matrix multiplication
分類資料結構
複雜度o(n^2)
形式與資料結構
c++** 一維結構體儲存
特性極簡封裝 不使用鍊錶 不需要轉置 計算過程容易理解
具體參考出處
《演算法導論》(寫的不想看)
備註//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
//稀疏矩陣儲存結構體 第乙個元素為矩陣頭,包含行列長度,元素總個數
typedef struct
sparse_mat;
void sparsematrixrectprint(sparse_mat* s_mat);
void sparsematrixtriprint(sparse_mat* s_mat);
sparse_mat* sparsematrixmul(sparse_mat* s_mat_a, sparse_mat* s_mat_b);
int _tmain(int argc, _tchar* argv)
; int mat_b[mat_b_row][mat_b_col] = ;
//計算有效元素數量
int mat_a_ele_count = 0;
int mat_b_ele_count = 0;
for (i = 0; i < mat_a_row; i++) }
for (i = 0; i < mat_b_row; i++) }
//動態分配
sparse_mat* sparse_m_a = (sparse_mat*)malloc((mat_a_ele_count + 1)*sizeof(sparse_mat));
sparse_mat* sparse_m_b = (sparse_mat*)malloc((mat_b_ele_count + 1)*sizeof(sparse_mat));
//存入稀疏矩陣資訊
sparse_m_a[0].row = mat_a_row;
sparse_m_a[0].col = mat_a_col;
sparse_m_a[0].element = mat_a_ele_count;
sparse_m_b[0].row = mat_b_row;
sparse_m_b[0].col = mat_b_col;
sparse_m_b[0].element = mat_b_ele_count;
for (i = 0, mat_a_ele_count = 0; i < mat_a_row; i++)
}} for (i = 0, mat_b_ele_count = 0; i < mat_b_row; i++)
}} //列印原陣列
sparsematrixrectprint(sparse_m_a);
sparsematrixrectprint(sparse_m_b);
//sparsematrixtriprint(sparse_m_a);
//sparsematrixtriprint(sparse_m_b);
//計算稀疏矩陣乘法
sparse_mat* sparse_m_c = (sparse_mat*)sparsematrixmul(sparse_m_a, sparse_m_b);
sparsematrixrectprint(sparse_m_c);
system("pause");
return 0;
}//三元組稀疏矩陣乘法函式 極簡封裝 需要花費一點時間計算申請的記憶體 但是肯定比煉表省空間啦
//method written by zhonglihao
sparse_mat* sparsematrixmul(sparse_mat* s_mat_a, sparse_mat* s_mat_b)
//申請乙個長度為b列寬的快取 兩個用途 計算輸出大小時做列封禁,計算相乘時做和快取
int* col_buffer = (int*)malloc(s_mat_c_col*sizeof(int));
//清空快取區
for (k = 0; k < s_mat_c_col; k++) col_buffer[k] = 0;
//判斷需要輸出的三元大小申請記憶體
int malloc_element_count = 0;
for (i = 1; i <= s_mat_a_ele_count; i++)
for (j = 1; j <= s_mat_b_ele_count; j++)
}} sparse_mat* s_mat_c = (sparse_mat*)malloc((malloc_element_count + 1)*sizeof(sparse_mat));
s_mat_c[0].row = s_mat_c_row;
s_mat_c[0].col = s_mat_c_col;
s_mat_c[0].element = malloc_element_count;
int s_mat_c_ele_count = 0;//用於存入元素時做指標
//開始進行乘法相乘
for (k = 0; k < s_mat_c_col; k++) col_buffer[k] = 0;//清理列快取
for (i = 1; i <= s_mat_a_ele_count; i++)
//如果要換行或者是最後一行
if (((i != s_mat_a_ele_count) && (s_mat_a[i].row != s_mat_a[i + 1].row)) || i == s_mat_a_ele_count)
}} }
//釋放快取 返回結果
free(col_buffer);
return s_mat_c;
}//稀疏矩陣列印 按矩形列印 需要確定三元組按z排列有序
void sparsematrixrectprint(sparse_mat* s_mat)
else
}//for
printf("\n");
}//for
//跳空換行 返回
printf("\n");
return;
}//稀疏矩陣列印 按三元組結構列印
void sparsematrixtriprint(sparse_mat* s_mat)
//跳空換行 返回
printf("\n");
return;
}
資料結構 稀疏矩陣
稀疏矩陣 矩陣中有效資料的個數遠遠小於無效資料的個數,則可以稱之為稀疏矩陣 如果還像以前那樣將每個稀疏矩陣的資料都儲存起來,則會造成記憶體的很大程度的浪費,所以應用特別的儲存方式。稀疏矩陣的壓縮儲存 使用 三元組儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後順序依次存放。矩陣的轉置 將...
資料結構 稀疏矩陣
簡單的說,設矩陣amn中有s個非零元素,若s遠遠小於矩陣元素的總數,則稱a為稀疏矩陣。s與m x n的比稱為矩陣的稀疏因子。當用陣列儲存稀疏矩陣中的元素時,僅有少部分的空間被利用,造成空間的浪費,為了節省儲存空間,可以採用一種壓縮的儲存方法來表示稀疏矩陣。由於非零元素的分布一般是沒有規律的,因此在儲...
資料結構 稀疏矩陣
稀疏矩陣時矩陣中的一種特殊情況,其非零元素的個數遠遠小於零元素個數。1.順序儲存 非零元素三元組的結構定義 struct triple 其中row代表行號,col代表列號,val用來儲存元素值 稀疏矩陣的順序儲存型別定義 struct smatrix m,n,t域分別用來儲存稀疏矩陣的行數,列數,非...