• //稀疏矩阵 三元组算法


    ////////////////////////////////////////////
    //稀疏矩阵的算法 模式匹配 				  //
    //三元组算法							  // 
    //Author:Wang Yong				  		  //	
    //Date:	2010.8.19				  		  //
    ////////////////////////////////////////////
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 1000			//矩阵中非0元素的个数 
    typedef int ElemType;
    
    ////////////////////////////////////////////
    
    //定义三元组
    
    typedef struct
    {
    	int row,col;			//非零元素的行号列号 
    	ElemType e;				//非零元素的值 
    }Triple; 
    
    //定义三元组表
    
    typedef struct
    {
    	Triple data[MAX+1];		//三元组的表,data[0]未用 
    	int m,n,num;			//矩阵的行数,列数和非零元素个数 
    }TSMatrix;
    
    ////////////////////////////////////////////////
    
    //三元组表的创建
    
    void CreatTSMatrix(	TSMatrix &M)
    { 
    	printf("请输入稀疏矩阵的行数:");
    	scanf("%d",&M.m);
    	printf("请输入稀疏矩阵的列数:");
    	scanf("%d",&M.n);
    	printf("请输入矩阵中非零元素的个数:");
    	scanf("%d",&M.num);
    	
    	int i;
    	for(i = 1; i <= M.num; i++)
    	{
    		printf("请输入第%d个元素的行号和列号及其元素的值:",i);
    		scanf("%d %d %d",&M.data[i].row,&M.data[i].col,&M.data[i].e);
    	}
    } 
    //////////////////////////////////////////////
    
    //三元组的快速转置
    
    TSMatrix FastTransMatrix(TSMatrix A,TSMatrix &B)
    {
    	int number[MAX];
    	int position[MAX];
    	int i,j,temp;
    	B.m = A.n;
    	B.n = A.m;
    	B.num = A.num;
    	if(A.num)
    	{
    		for(j = 0; j < A.n;j++)			//矩阵A每一列非零元素的个数初始化 
    			number[j] = 0;
    			
    		for(i = 1 ; i <= A.num;i++)		//求矩阵中的每一列的非零元素个数
    			number[A.data[i].col]++;
    				
    		position[0] = 1;				//position[i]为第i列第一个元素在B.data中的位置 
    		for(j = 1 ; j < A.n; j++)		//求A.data的第j列第一个非零元素在B.data中的序号 
    			position[j] = position[j-1] + number[j-1];				
    		//求转置矩阵B的三元组表
    		for(i = 1 ; i <= A.num;i++)
    		{
    			j = A.data[i].col;
    			temp = position[j];
    			B.data[temp].row = A.data[i].col;
    			B.data[temp].col = A.data[i].row;
    			B.data[temp].e = A.data[i].e;
    			
    			position[j]++;//第j列上后续元素的位置	 
    		} 
    	}
    	return B;
    } 
    
    //输出稀疏矩阵
    
    void Output(TSMatrix M)
    {
    	int i,j;
    	int cnt = 1;
    	int e = 0;
    	for(i = 0; i < M.m;i++)
    	{
    		for(j = 0; j < M.n;j++)
    		{
    			if(i == M.data[cnt].row && j == M.data[cnt].col)
    			{
    				printf("%5d",M.data[cnt].e);
    				++cnt;
    			}
    			else
    				printf("%5d",e);
    		}
    		printf("\n");
    	}
    }
    ///////////////////////////////////////////
    
    // 输出三元组表
    
    void Print(TSMatrix M)
    {
    	int i;
    	printf("{");
    	for(i = 1; i <= M.num;i++)
    	{
    		printf("( %d, %d, %d) ",M.data[i].row,M.data[i].col,M.data[i].e);
    	}
    	printf("}");
    } 
    
    ////////////////////////////////////////////////// 
    int main()
    {
    	TSMatrix M,N;
    	CreatTSMatrix(M);
    	Output(M);
    	Print(M);
    	printf("\n"); 
    	FastTransMatrix(M,N);
    	Output(N);
    	Print(N);
    	printf("\n");
    	return 0;
    }
    
  • 相关阅读:
    Neural Collaborative Filtering 神经网络协同过滤
    pyspark(一) 常用的转换操作
    HO引擎近况20210315
    LeetCode–前 K 个高频元素
    常用十大算法(七)— 克鲁斯卡尔算法
    常用十大算法(六)— 普里姆算法
    LeetCode–数值的整数次方
    LeetCode–二叉树的层次遍历 II
    常用十大算法(五)— 贪心算法
    LeetCode–二进制中1的个数
  • 原文地址:https://www.cnblogs.com/newwy/p/1847470.html
Copyright © 2020-2023  润新知