设计算法,将m*n稀疏矩阵转换成三元组表示,并分析其时间复杂度和空间复杂度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计算法,将m*n稀疏矩阵转换成三元组表示,并分析其时间复杂度和空间复杂度相关的知识,希望对你有一定的参考价值。
开三个二维数组,两个用于相加,一个存放结果。二重循环将数组对应位置元素的和置倒结果数组的对应位置。m*n的矩阵,时间复杂度为O(m*n) 参考技术A 哈哈 私聊
稀疏矩阵的加法(用十字链表实现A=A+B)
描写叙述:
输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果。
输入:
第一行输入四个正整数,各自是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,各自是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值。
输出:
输出相加后的矩阵三元组。
输入例子:
3 4 3 2 1 1 1 1 3 1 2 2 2 1 2 1 2 2 3
输出例子:
1 1 1 1 2 1 1 3 1 2 2 5
#include <stdio.h> #include<stdlib.h> typedef struct OLNODE { int row,col; int data; struct OLNODE *right,*down; } NODE,*LNODE; typedef struct CORSS { LNODE *rh,*ch; int ra,ca,da; } CROSS, *LCROSS; void Create(LCROSS A); void PlusToA(LCROSS A,LCROSS B); void PrintCross(LCROSS A); int main() { LCROSS A = (LCROSS)malloc(sizeof(CROSS)); LCROSS B = (LCROSS)malloc(sizeof(CROSS)); scanf("%d %d %d %d",&A->ra,&A->ca,&A->da,&B->da); B->ra = A->ra; B->ca = A->ca; Create(A); Create(B);//" 3 4 0 5 创建时B有问题" PlusToA(A,B); PrintCross(A); return 0; } void Create(LCROSS M) { int i; LNODE p,temp; M->rh = (LNODE *)malloc((M->ra+1)*sizeof(LNODE)); M->ch = (LNODE *)malloc((M->ca+1)*sizeof(LNODE)); for(i=1; i<=M->ra; i++) { M->rh[i]=NULL; } /*for(i=1; i<=M->ca; i++) { M->ch[i]=NULL; }*/ if(M->da != 0) { for(i=1; i<=M->da; i++) { p=(LNODE)malloc(sizeof(NODE)); scanf("%d %d %d",&p->row,&p->col,&p->data); if(M->rh[p->row] == NULL) { p->right=NULL; M->rh[p->row] = p; } else { for(temp=M->rh[p->row];; temp=temp->right) { if(temp->right == NULL) { temp->right = p; p->right =NULL; break; } else if(temp->col < p->col && temp->right->col>p->col) { p->right = temp->right; temp->right = p; break; } else if(temp==M->rh[p->row] && temp->col>p->col) { p->right = temp; temp=p; break; } } } /* if(M->ch[p->col] == NULL|| M->ch[p->col]->row>(p->row)) { p->down=M->ch[p->col]; M->ch[p->col] = p; } else { for(temp=M->ch[p->col]; temp->down && temp->down->row<p->row; temp=temp->down); p->down = temp->down; temp->down = p; }*/ } } } void PlusToA(LCROSS A,LCROSS B) { int i; LNODE p,temp1,temp2; for(i=1; i<=A->ra; i++) { if(B->rh[i] == NULL) continue; else { if(A->rh[i] == NULL) { p=(LNODE)malloc(sizeof(NODE)); p->col = B->rh[i]->col; p->row = B->rh[i]->row; p->data = B->rh[i]->data; A->rh[i]=p; p->right = NULL; B->rh[i]=B->rh[i]->right; } if(B->rh[i]==NULL)continue; for(temp1=B->rh[i];; temp1=temp1->right) { for(temp2=A->rh[i];; temp2=temp2->right) { if(temp2->col == temp1->col) { temp2->data+=temp1->data; break; } else if(temp2==A->rh[i] && temp1->col<temp2->col) { p=(LNODE)malloc(sizeof(NODE)); p->col = temp1->col; p->row = temp1->row; p->data = temp1->data; p->right = temp2->right; p->right =temp2; A->rh[i]=p; break; } else if((temp2->right == NULL || temp2->right->col>temp1->col) && temp1->col>temp2->col) { p=(LNODE)malloc(sizeof(NODE)); p->col = temp1->col; p->row = temp1->row; p->data = temp1->data; p->right = temp2->right; temp2->right=p; break; } } if(temp1->right == NULL) break; } } } } void PrintCross(LCROSS A) { int i; LNODE p; for(i=1; i<=A->ra; i++) { p=A->rh[i]; while(p!=NULL) { printf("%d %d %d\n",p->row,p->col,p->data); p=p->right; } } }
TIP:
1、仅使用了十字链表中的行链表,列链表被凝视掉了,由于本题中没用。
2、注意改动链表时一定要改动原链表变量!!
如,定义链表A。temp=A。改动temp=p不能达到改动链表A=p的目的。
以上是关于设计算法,将m*n稀疏矩阵转换成三元组表示,并分析其时间复杂度和空间复杂度的主要内容,如果未能解决你的问题,请参考以下文章