資料結構 稀疏矩陣乘法演算法實現

2021-08-20 21:25:42 字數 3282 閱讀 2701

作者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域分別用來儲存稀疏矩陣的行數,列數,非...