稀疏矩阵
- 稀疏矩阵每个元素由3个元素组成,所以原数据1/3以下存储划算。
- 矩阵的转置如果简单调换行和列,会使行优先变成列优先。
代码收获
- 稀疏矩阵里嵌套的结构体是数组形式,分配给总的那个结构体空间后不用另外给他分配空间。
- 插入数据除了自己写方法外,还可以使用数组插入
int a[]={1,2,4,5,6}
然后使用循环把数据弄进去。 - 快速定位就是算位置,最后调换过程直接想容易搞蒙,一步步写出中间过程就会很简单。
- 快速定位的2个数组存数据方法还是比较巧妙的。思路值得学习一下。
#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100
//稀疏矩阵,每一个元素所在位置的结构体
typedef struct threeele{
int row,col;
int data;
}thele;
//矩阵的结构体
typedef struct matr{
thele ele[MAXSIZE+1];//利用前面顺序存储思想,下面的非零个数是从1开始的。
int m ,n,len;//矩阵长宽非零个数
}matrix,*matrixp;
void initialmatrix(matrixp* T){
*T =(matrixp)malloc(sizeof(matrix));
(*T)->len=0;
(*T)->m=20;
(*T)->n=20;
}
void addele(matrixp T,int row,int col,int data){//添加数据
int num;
num = T->len;
T->ele[num+1].row=row;
T->ele[num+1].col=col;
T->ele[num+1].data=data;
T->len=num+1;
}
void Printmatrix(matrixp T){//打印矩阵
int num,i;
num=T->len;
for(i=1;i<=num;i++){
printf("%d ",T->ele[i].row);
printf("%d ",T->ele[i].col);
printf("%d ",T->ele[i].data);
printf("\n");
}
}
//方法一 扫描转置 时间复杂度O(n*len)
void matter1(matrixp T,matrixp P){
P->len=T->len;
int num,i,k=1;
for(num=1;num<T->n;num++){//列变成行,所以扫T所有列,作为P行
for(i=1;i<=T->len;i++){//有几个数组元素
if(T->ele[i].col==num){//如果扫描到,就加到新矩阵里
P->ele[k].row=T->ele[i].col;
P->ele[k].col=T->ele[i].row;
P->ele[k].data=T->ele[i].data;
k++;
}
}
}
}
//方法二 快速定位 时间复杂度O(len+n)
void fastmatter(matrixp T,matrixp P){//对列进行扫 找个数组保num[k]存扫k列元素个数 position[k]表示k列第一个元素的位置
int num[MAXSIZE+1]={0};
int positon[MAXSIZE+1]={0};
int i,k,j;
for(i=1;i<=T->len;i++){//获取i列元素个数
num[T->ele[i].col]++;
}
positon[1]=1;//初始值 有元素的话就放在第一行
for(k=2;k<=T->n;k++){
positon[k]=positon[k-1]+num[k-1];
}
for(j=1;j<=T->len;j++){
int liehao=T->ele[j].col;
int hanghao=positon[liehao];
P->ele[hanghao].col=T->ele[j].row;
P->ele[hanghao].row=T->ele[j].col;
P->ele[hanghao].data=T->ele[j].data;
positon[liehao]++;//同行号的赋值过,下一个行号就会加一
}
P->len=T->len;
}
void main(){
matrixp T ,P;
initialmatrix(&T);
initialmatrix(&P);
addele(T,1,2,11);
addele(T,1,3,12);
addele(T,3,1,13);
addele(T,3,6,14);
addele(T,4,3,15);
addele(T,5,2,16);
addele(T,6,2,17);
Printmatrix(T);
// matter1(T,P);
fastmatter(T,P);
printf("转制后\n");
Printmatrix(P);
}
1 2 11
1 3 12
3 1 13
3 6 14
4 3 15
5 2 16
6 2 17
转制后
1 3 13
2 1 11
2 5 16
2 6 17
3 1 12
3 4 15
6 3 14
Process finished with exit code 8