数据结构 C语言 JAVA语言 顺序存储稀疏矩阵三元组表 一般转置法和快速转置法


//顺序存储稀疏矩阵三元组表 一般转置法和快速转置法
#include<stdio.h>
#include<stdlib.h>

#define MaxSize 1000
typedef int DataType;
typedef struct {
    int i, j;
    DataType v;
}TriTupleNode;

typedef struct {
    TriTupleNode data[MaxSize];
    int m, n, t;
}TSMatrix;


//建立一个顺序存储稀疏矩阵三元组表
void CreateTriTable(TSMatrix *b,int a[][5],int m,int n) {
    int  k = 0;
    int i, j;
    for (i = 0; i < m;i++) {
        for (j = 0; j < n; j++) {
            if (a[i][j]!=0) {
                b->data[k].i = i;
                b->data[k].j = j;
                b->data[k].v = a[i][j];
                k++;
            }
        }
        
    }
    b->m = m;
    b->n = n;
    b->t = k;
}

//一般转置算法
void TransMatirx(TSMatrix* a, TSMatrix* b) {
    int p,col,q=0;
    
    b->m = a->n;
    b->n = a->m;
    b->t = a->t;
    if (b->t<0) {
        printf("M中无非零元素");
    }else {
        for (col = 0; col < a->n;col++) {
            for (p = 0; p < a->t;p++) {
                if (col == a->data[p].j) {
                    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++;
                }
            }
        }
    }
}


//快速转置法
void FastTran(TSMatrix* a, TSMatrix* b) {
    
    int col,t,p,q;
    int* num, * rownext;
    num = (int *)calloc(a->n + 1, 4);
    rownext = (int *)calloc(a->m + 1, 4);
    b->m = a->n;
    b->n = a->m;
    b->t = a->t;
    if (b->t) {
        for (col = 0; col < a->n;col++) {
            num[col] = 0;
        }
        for (t = 0; t < a->t; t++) {
            ++num[a->data[t].j];
        }
        rownext[0] = 0;
        for (col = 1; col < a->n; col++) {
            rownext[col] = rownext[col-1]+ num[col-1];
        }
        for (p = 0; p < a->t;p++) {
            col = a->data[p].j;
            q = rownext[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;
            ++rownext[col];
        }
    }
}


int main() {

    int a[][5]= { {0,3,0,5,0}, {0,0,-2,0,0}, {1,0,0,0,6}, {0,0,8,0,0}};
    TSMatrix *t = new TSMatrix;
    CreateTriTable(t, a, 4, 5);
    TSMatrix* b = new TSMatrix;

    //TransMatirx(t, b);
    FastTran(t, b);
}

//JAVA语言

public class TsMatirx {
    private static final int maxSize = 10000;
    private TriTupleNode data[] = new TriTupleNode[maxSize];
    //行数
    private int m = 0;
    //列数
    private int n = 0;
    //非 零个数
    private int t = 0;

    //建立一个顺序存储稀疏矩阵三元组表
    public  void createTriTable(TsMatirx b, int a[][], int m, int n) {
        int k = 0, i, j;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                if (a[i][j] != 0) {
                    TriTupleNode triTupleNode = new TriTupleNode();
                    triTupleNode.i = i;
                    triTupleNode.j = j;
                    triTupleNode.v = a[i][j];
                    b.data[k] = triTupleNode;
                    k++;
                }
            }
        }
        b.m = m;
        b.n = n;
        b.t = k;
    }

    //一般转置算法
    public  void transMatirx(TsMatirx a, TsMatirx b) throws Exception {
        int col, p, q = 0;
        if (a.t < 1) {
            throw new Exception("无非零元素");
        } else {
            b.m = a.n;
            b.n = a.m;
            b.t = a.t;
            for (col = 0; col < a.n; col++) {
                for (p = 0; p < a.t; p++) {
                    if (col == a.data[p].j) {
                        TriTupleNode triTupleNode = new TriTupleNode();
                        triTupleNode.i = a.data[p].j;
                        triTupleNode.j = a.data[p].i;
                        triTupleNode.v = a.data[p];
                        b.data[q] = triTupleNode;
                        q++;
                    }
                }
            }
        }
    }


    public void fastTran(TsMatirx a, TsMatirx b) throws Exception {
        int col, t, p, q;
        if (a.t < 1) {
            throw new Exception("无非零元素");
        } else {
            b.m = a.n;
            b.n = a.m;
            b.t = a.t;
            int num[] = new int[a.n];
            int rownext[] = new int[a.n];
            for (col = 0; col < a.n; col++) {
                num[col] = 0;
                rownext[col] = 0;
            }
            for (t = 0; t < a.t; t++) {
                num[a.data[t].j] = ++num[a.data[t].j];
            }
            for (col = 1; col < a.n; col++) {
                rownext[col] = rownext[col - 1] + num[col - 1];
            }

            for (p = 0; p < a.t; p++) {
                q = rownext[a.data[p].j];
                TriTupleNode triTupleNode = new TriTupleNode();
                triTupleNode.i = a.data[p].j;
                triTupleNode.j = a.data[p].i;
                triTupleNode.v = a.data[p];
                b.data[q] = triTupleNode;
                rownext[a.data[p].j] = ++rownext[a.data[p].j];
            }

        }


    }



    private class TriTupleNode {
        public int i = 0;
        public int j = 0;
        public Object v = 0;

    }

    public static void main(String[] args) throws Exception {
        int a[][] = {{0, 3, 0, 5, 0}, {0, 0, -2, 0, 0}, {1, 0, 0, 0, 6}, {0, 0, 8, 0, 0}};
        TsMatirx t = new TsMatirx();
        t.createTriTable(t,a,4,5);
        TsMatirx b = new TsMatirx();
        b.transMatirx(t,  b);
        TsMatirx c = new TsMatirx();
        b.fastTran(t,c);

        System.out.println();

    }
}

 

 

 

 

 

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是三元存储稀疏矩阵快速的C语言实现算: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 // 定义三元组最大元素个数 // 三元组结构体 typedef struct { int i, j, e; // 行下标、列下标、元素值 } Triple; // 稀疏矩阵结构体 typedef struct { Triple data[MAXSIZE + 1]; // 三元,data[0]未用 int mu, nu, tu; // 行数、列数、非零元素个数 } Matrix; // 稀疏矩阵 void Transpose(Matrix M, Matrix *T) { int p, q, col; int num[M.nu + 1]; int cpot[M.nu + 1]; T->mu = M.nu; T->nu = M.mu; T->tu = M.tu; if (T->tu) { for (col = 1; col <= M.nu; ++col) num[col] = 0; for (p = 1; p <= M.tu; ++p) ++num[M.data[p].j]; cpot[1] = 1; for (col = 2; col <= M.nu; ++col) cpot[col] = cpot[col - 1] + num[col - 1]; for (p = 1; p <= M.tu; ++p) { col = M.data[p].j; q = cpot[col]; T->data[q].i = M.data[p].j; T->data[q].j = M.data[p].i; T->data[q].e = M.data[p].e; ++cpot[col]; } } } int main() { Matrix M, T; int i, j, k; printf("请输入稀疏矩阵的行数、列数和非零元素个数:"); scanf("%d%d%d", &M.mu, &M.nu, &M.tu); printf("请输入稀疏矩阵三元:\n"); for (k = 1; k <= M.tu; ++k) { scanf("%d%d%d", &M.data[k].i, &M.data[k].j, &M.data[k].e); } Transpose(M, &T); printf("后的稀疏矩阵三元为:\n"); for (k = 1; k <= T.tu; ++k) { printf("%d %d %d\n", T.data[k].i, T.data[k].j, T.data[k].e); } return 0; } ``` 算思路: - 遍历原稀疏矩阵中每个非零元素,统计每列非零元素个数并存储在num数组中。 - 根据num数组计算每列第一个非零元素在后的三元中的位存储在cpot数组中。 - 遍历原稀疏矩阵中每个非零元素,将其存储后的三元中。由于后的三元是按列存储的,因此要先按列顺序遍历,再按行顺序存储

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值