算法----稀疏矩阵之三元组

三元组的表示

(1)、目的:对于在实际问题中出现的大型的稀疏矩阵,若用常规分配方法在计算机中储存,将会产生大量的内存浪费,而且在访问和操作的时候也会造成大量时间上的浪费,为了解决这一问题,从而善生了多种解决方案。

(2)、由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。具体操作是:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。

具体如下图:

#define SMAX 1000
typedef struct
{
     int i,j;          //储存非零元素的行和列信息
     datatype v; //非零元素的值
}SPNode;        //定义三元组类型
typedef struct
{
     int mu,nu,tu; //矩阵的行、列和非零元素的个数
     SPNode data[SMAX]; //三元组表
}SPMatrix;

稀疏矩阵的转置

操作:一个n*m的稀疏矩阵转置后得到的将是一个m*n的矩阵。简单来说就是讲三元组中的行标和列标交换,但是仅仅是这样就结束了么? 当然不是。前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B 也必须按此规律实现。

 =》 

算法思路:

①A 的行、列转化成B 的列、行;
②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。

由于对于A的转置是自上而下的,也就要求对于A中任意元素的转置后位置必须是可知的,而原储存顺序是按行号排列的,所以转置前同列的在前面的转置后一定还在同行的前方。故确定了转置后的每行的第一个元素的位置即确定整个顺序。具体计算如下图

代码如下:

void TransM1 (SPMatrix *A)

{
     SPMatrix *B;
    int p,q,col;
    B=malloc(sizeof(SPMatrix)); /*申请存储空间*/
    B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;
    /*稀疏矩阵的行、列、元素个数*/
    if (B->tu != 0) /*有非零元素则转换*/
    {
        q=0;
        for (col=1; col<=(A->nu); col++)
      { /*按A 的列序转换*/
          for (p=1; p<= (A->tu); 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++;
              }/*if*/
      }

    } /*if(B->tu>0)*/
    return B; /*返回的是转置矩阵的指针*/
} /*TransM1*/  
时间: 2024-10-22 16:44:00

算法----稀疏矩阵之三元组的相关文章

javascript实现数据结构: 稀疏矩阵之三元组线性表表示

稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设  δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦0.05时称为稀疏矩阵, 稀疏矩阵的压缩存储 对于稀疏矩阵,采用压缩存储方法时,只存储非0元素.必须存储非0元素的行下标值.列下标值.元素值.因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素. 上图的稀疏矩阵A的三元组线性表为: ( (1,2,12), (1,3,9), (3,1

矩阵压缩存储之三元组顺序表

形态: 实现: /***************************************** 稀疏矩阵的三元组顺序表存储表示 by Rowandjj 2014/5/3 ******************************************/ #include<IOSTREAM> using namespace std; #define MAXSIZE 12500//非零元个数的最大值 typedef int ElemType; typedef struct _DATA_

(转) 白话经典算法系列之三 希尔排序的实现(附源代码实现)

链接:http://blog.csdn.net/morewindows/article/details/6668714 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率

白话经典算法系列之三 希尔排序的实现

分类: 白话经典算法系列 2011-08-08 11:41 47406人阅读 评论(46) 收藏 举报 算法shell优化c 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情

【STL源码学习】STL算法学习之三

第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分.  is_partitioned 函数原型: template <class InputIterator, class UnaryPredicate> bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred); 函数作用: 如果序列被分为两部分,前一部分pred都

《直接插入排序》算法设计之三

直接插入排序 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的序列中,知道全部记录插入完成. 排序过程 1.每次插入的数值都要与自己前面的做比较 A.如果大于前面的数,则停止.因为每次都是排好的序列 B.如果小于前面的数,接着向前比较,指导找到自己的位置,插入即可 如右图所示 当插入2时,需要与前面做比较,直到找到自己合适的位置即可 当插入1时,用现在插入的数值依次与前面做比较,直到找到合适的位置即可 代码分析 通过以上的分析,因此我们可以采取以下思路来处理直接插入排序 方法一 找位

软件设计师-数据结构与算法-稀疏矩阵

例: 答:代入法 i = A0 j=A0 M=1(注意M的下标是从1开始) 原文地址:https://www.cnblogs.com/myunity/p/11978288.html

QVegas-一个升级版的TCP Vegas拥塞算法

拥塞避免带来了很多疑惑,本文解开这个疑惑并给出一个实实在在但却很简陋的算法.        其实在基于丢包的拥塞算法中,拥塞避免的过程总是伴随着AI和MD的,不能光说AI而忽略MD.        如果考虑的是基于时延的拥塞算法,AI和MD事实上是不需要的,因为算法会根据时延的变化来调整窗口.        所以说,AIMD是基于丢包的算法中采取的窗口调整方法,其中AI保证了带宽利用率,而MD则保证了公平性.对于基于时延的算法而言,带宽的利用率和公平性保证均分散性体现在算法的执行过程中了,其中:

笔试算法题(54):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件

议题:快速排序算法实现之三(三路划分遍历,解决与划分元素相等元素的问题) 分析: 算法原理:使用三路划分策略对数组进行划分(也就是荷兰国旗问题,dutch national flag problem).这个实现是对实现二的改进,它添加处理等于划分元素的值的逻辑,将所有等于划分元素的值集中在一起,并且以后都不会再对他们进行划分. 本算法中使用四个标示值进行操作.使用left和right同时向中间遍历时,当left遇见等于划分元素时,就与iflag指向的值进行交换 (iflag指向的当前值到最左端表