zoukankan      html  css  js  c++  java
  • 数据结构之数组

    数组本身就是一种数据结构,他是对线性表的一种扩充数组主要用于对矩阵的压缩和表示

    一.特殊矩阵的压缩

    二.稀疏矩阵的压缩

         1.三元组表示法:

    #include<stdio.h>
    #define MAXSIZE 1000
    typedef int ElemType;
    //定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据 
    typedef struct Node{
    	int row,col;
    	ElemType data;
    }Triple;
    //定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组,
    //原矩阵的行数,列数,新压缩矩阵非零点的个数 
    typedef struct YS{
    	Triple data[MAXSIZE+1];//data[0]抛弃不用 
    	int m,n,len;
    }TSMatrix;
    

      

                三元组表示法下的稀疏矩阵转置

                        

    #include<stdio.h>
    #define MAXSIZE 1000
    typedef int ElemType;
    //定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据 
    typedef struct Node{
    	int row,col;
    	ElemType data;
    }Triple;
    //定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组,
    //原矩阵的行数,列数,新压缩矩阵非零点的个数 
    typedef struct YS{
    	Triple data[MAXSIZE+1];//data[0]抛弃不用 
    	int m,n,len;
    }TSMatrix;
    
    
    //矩阵转置 :列序递增转置法 
    void TransposTSMatrix(TSMatrix A,TSMatrix B)
    {
    	int i,j=1,k;
    	if(B.len>0)
    	{
    		
    		for(k=1;k<A.n;k++)
    			for(i=1;i<A.len;i++)
    				if(A.data[i].col==k)
    				{
    					B.data[j].row=A.data[i].col;
    					B.data[j].col=A.data[i].row;
    					B.data[j].data=A.data[i].data;
    					j++;
    				}
    	
    	}
    }
                         
    
    //一次定位快速转置法
    void FastTransportTSMatrix(TSMatrix* A,TSMatrix* B)
    {
    	int col,t,p,q;
    	int num[MAXSIZE],postion[MAXSIZE];//num[i]记载A中第i列中非零元素个数,
    //postion[i]中记载A中第i列中下一个非零元素在三元组表B中的正确存放位置
    	B->len=A->len;
    	B->n=A->m;
    	B->m=A->n;
    	if(B->len)
    	{
    		//初始化每列中的非零元素个数为0 
    		for(col=1;col<=A->len;i++)
    			num[col]=0;
    		//计算出A每列中非零元素的个数 
    		for(t=1;t<=A->len;t++)
    			num[A->data[t]->col]++;
    		//第一列中第一个非零元素在B中的位置 
    		potion[1]=1;
    		//计算出每列中第一个非零元素在三元组表B中的正确存放位置 
    		for(col=2;col<=A->n;col++)
    		postion[col]=postion[col-1]+num[col-1];
    		
    		//依次将A中每一个元素按照列序转置 
    		for(p=1;p<=A->len;p++)
    		{
    			col=A->data[p]->col;q=postion[col];
    			B->data[q]->col=A->data[p]->row;
    			B->data[q]->row=A->data[p]->col;
    			B->data[q]->data=A->data[p]->data;
    			postion[col]++;
    		}
    		
    	}
    	 
    } 
    

          

      二.稀疏矩阵的链式存储结构:十字链表

    建立十字链表

    #include<stdio.h>
    typedef ElemType int;
    typedef struct OLNode
    {
    	int row,col;
    	ElemType value;
    	struct OLNode* right,*down;	
    }OLNode,*OLink;
    typedef struct TS
    {
    	//行链表,列链表的头指针向量 
    	OLink row_head,col_head;
    	int m,n,len;//稀疏矩阵的行数,列数,非零元素的个数 
    }CrossList;
    

      

            

    亲爱的听众朋友我是你的代班DJ
  • 相关阅读:
    gain 基尼系数
    luogu P5826 【模板】子序列自动机 主席树 vector 二分
    牛客挑战赛39 树与异或 离线 树上莫队 树状数组 约数
    4.22 省选模拟赛 三元组 manacher 回文自动机
    4.22 省选模拟赛 最优价值 网络流 最大权闭合子图
    4.18 省选模拟赛 消息传递 树剖 倍增 线段树维护等比数列
    luogu P4008 [NOI2003]文本编辑器 splay 块状链表
    牛客挑战赛39 密码系统 后缀数组
    luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
    luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并
  • 原文地址:https://www.cnblogs.com/YTYMblog/p/5414715.html
Copyright © 2011-2022 走看看