博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
稀疏矩阵的十字链表存储
阅读量:7081 次
发布时间:2019-06-28

本文共 891 字,大约阅读时间需要 2 分钟。

稀疏矩阵的压缩存储有几种方式,如:三元组顺序表、行逻辑链接的顺序表和十字链表。

使用链表存储的好处是:便于矩阵中元素的插入和删除。

例如:“将矩阵B加到矩阵A上”,那么矩阵A存储的元素就会有变动。比如会增加一些非零元,或者删除一些元素(因为bij+aij=0)。

下图是矩阵M和M的十字链表存储:

十字链表及其结点可用如下结构体表示:

typedef struct OLNode{    int i, j; // 非零元的行列下标    ElemType e;    struct OLNode *right, *down; // 向右域和向下域} OLNode, *OLink;typedef struct{    OLink *rhead, *chead; // 行链表和列链表的头指针数组    int mu, nu, tu; // 稀疏矩阵的行数、列数和非零元个数} CrossList;

在通过代码创建十字链表时,要特别注意right、down和rhead、chead这些指针的赋值。

现在来看“将矩阵B加到矩阵A上”这个问题。所要做的操作:aij +bij,其结果一共会有4种情况:

  1. aij(bij = 0)(不做变化)
  2. bij(aij = 0)(在A中插入一个新结点)
  3. aij +bij ≠ 0 (改变结点aij的值域)
  4. aij +bij = 0 (删除结点aij

假设指针pa和pb分别指向矩阵A和B中行值相同的两个结点,对于上述4种情况的处理过程为:

  1. 若“pa == NULL”或“pa->j大于pb->j”,则在矩阵A中插入一个值为bij的结点。并且需要修改同一行前一结点的right指针,和同一列前一结点的down指针。
  2. 若“pa->j小于pb-j”,则pa指针右移一步。
  3. 若“pa->j等于pb-j”,并且“pa->e + pb->e != 0”,则修改pa->e即可。
  4. 若“pa->j等于pb-j”,并且“pa->e + pb->e == 0”,则需要删除矩阵A中pa所指结点。并且需要修改同一行前一结点的right指针,和同一列前一结点的down指针。

转载地址:http://ngoml.baihongyu.com/

你可能感兴趣的文章
Oracle把Java EE的未来押在Rest API上了?
查看>>
Vue性能优化:如何实现延迟加载和代码拆分?
查看>>
Visual Studio 2017 15.8第一个预览版发布,支持ARM64
查看>>
Homebrew 1.9发布,将支持Linux与Windows 10
查看>>
JavaScript学习笔记第三天_对象
查看>>
C++17标准制定完成
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
OpenAI发布大型强化深度学习模拟器Neural MMO,AI适者生存择最优
查看>>
入门解读:小白也能看懂的容器和虚拟机介绍
查看>>
企业级区块链现状研究报告:小企业的投资总额是大企业的28倍
查看>>
php解析带有命名空间的xml
查看>>
在首次发布三周之后,MLflow迎来了0.2版本
查看>>
微软发布面向企业区块链网络的Coco Framework
查看>>
.NET Core中的去虚
查看>>
REST是否会步SOAP的后尘?
查看>>
微服务意味着分布式系统
查看>>
前端大神用React刻了一个Windows XP
查看>>
10种避免大型部署的方法
查看>>
Yelp的实时流技术之二:将MySQL表数据变更实时流到Kafka中
查看>>
数据不可变之linked-in/rocketdata
查看>>