数据结构---如何节省空间
1,稀疏矩阵
稀疏矩阵
定义:对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。
如果矩阵中每一个点都用数组方式表示,那么会浪费很大的空间,因为大部分矩阵中的点的值都为0,因此可以采用一个一维数组表示n列,然后每一列采用一个链表的形式来表示,这样会节省很大的空间。
- #include <stdio.h>
- #define MaxSize 100
- typedef int DataType;
- typedef struct {
- DataType v;
- int i, j;
- }TriTupleNode;
- typedef struct {
- TriTupleNode data[MaxSize]; //三元组数组
- int m, n, t; //行数 列数以及非零元个数
- }TriTupleTable;
- void CreateTriTupleTable(TriTupleTable *T)
- {
- //int m, n, t;
- int i;
- printf("输入行数,列数以及非零元的个数:");
- scanf("%d%d%d", &T->m, &T->n, &T->t);
- for (i=1; i<=T->t; ++i)
- {
- printf("请输入第%d个顶点的行号列号以及值", i);
- scanf("%d%d%d", &T->data[i].i, &T->data[i].j, &T->data[i].v);
- }
- }
- void Traverse(TriTupleTable *T)
- {
- int i;
- printf("%d %d %d\n", T->m, T->n, T->t);
- for (i=1; i<=T->t; ++i)
- {
- printf("%d %d %d\n", T->data[i].i, T->data[i].j, T->data[i].v);
- }
- }
- void TransMatrix(TriTupleTable *A, TriTupleTable*B)
- {
- int p, q, col;
- B->m = A->n;
- B->n = A->m;
- B->t = A->t;
- if (0 == B->t)
- return ;
- q = 0;
- for (col=0; col<A->n; ++col)
- for (p=0; p<A->t; ++p)
- {
- if (A->data[p].j == col)
- {
- B->data[q].i = A->data[p].j;
- B->data[q].j = A->data[p].i;
- B->data[q].v = A->data[p].v;
- ++q;
- }
- }
- }
- int main(void)
- {
- TriTupleTable A, B;
- CreateTriTupleTable(&A);
- Traverse(&A);
- TransMatrix(&A, &B);
- Traverse(&B);
- return 0;
- }
2,通过bitmap的方式