稀疏矩陣,就是矩陣中的大多數元素為0,只有少量的非0元素。對於這種矩陣,直接儲存就有點浪費空間了,更好的辦法就是定義乙個結構體,結構體中的3個成員對應於非0元素的位置以及非0元素的值。然後在加上一些附加的資訊,比如矩陣的大小、非0元素的個數等等。聽起來挺簡單的,但是寫起來還是挺複雜的:
#include #include #include //使用隨機數呼叫
#include //通過時間生成隨機數種子
typedef int elemtype;
//表示稀疏矩陣的3元組:行號、列號,元素值
typedef struct triple
triple;
//使用線性表儲存這些3元組
typedef struct compressedsparsematrix
compressedsparsematrix;
//建立稀疏矩陣
void createsparsematrix(elemtype ***sparsematrix,int row, int col,int number)
//列印稀疏矩陣
for(int i = 0; i < row; ++i)
printf("\n");
} }
}//銷毀稀疏矩陣
void destroysparsematrix(elemtype ***sparsematrix,int row, int col)
//用乙個稀疏矩陣初始化壓縮矩陣
bool initcompressedsparsematrix(compressedsparsematrix* csm,elemtype ***sparsematrix,int row, int col,int number)
} return true;
}//銷毀壓縮的稀疏矩陣
void destroycompressedsparsematrix(compressedsparsematrix* csm)
//列印壓縮的稀疏矩陣
void printcompressedsparsematrix(compressedsparsematrix* csm)
}//通過線性表恢復稀疏矩陣
void transcpm2sm(compressedsparsematrix *cmp,elemtype ***sparsematrix)
else
(*sparsematrix)[i][j] = 0;
} }//列印轉化好的稀疏矩陣
for(int i = 0; i < cmp->row; ++i)
printf("\n");
} }
在主函式中:
int main()
這樣定義以後,稀疏矩陣的一些數學操作也會變得非常方便:矩陣的轉置只是將結構體中位置資訊的行、列交換一下順序;矩陣的加法、減法也是對應位置的元素的相加減,值得注意的是,運算完畢後,需要判斷結果是否為0。 稀疏矩陣線性表示
include include include define max 100 typedef structmatrix 乙個普通矩陣 typedef int spmatrix max 3 稀疏矩陣三元組表示法 乙個普通矩陣的初始化 void init matrix p,int m,int n 普通矩...
稀疏矩陣壓縮
對於那些零元素數目遠遠多於非零元素數目,並且非零元素的分布沒有規律的矩陣稱為稀疏矩陣 sparse 人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素沒有分布規律。由於稀疏矩陣中非零元素較少,零元素較多,因此可以採用只儲存...
DS 線性表壓縮
題目描述 將乙個含有零元的線性表中的零元刪除,其他非零元的相對順序不變,稱為線性表的壓縮。每乙個非零元壓縮後的新下標與原下標之差乘以元素值稱為壓縮代價。編寫程式對線性表進行壓縮,並計算所有非零元的壓縮代價的總和。輸入輸入的第一行為測試用例數m,0 m 100。從第二行開始,每行為乙個測試用例。每個測...