c언어로 희소행렬의 행 바꾸기 및 출력 구현
이번에 작성한 코드는 희소행렬에 관한 것인데요
우선 희소행렬이란 기존의 우리가 표현 했던 것처럼
[1, 0 ,0,
0, 3, 0,
0, 6, 0]
과 같이 행렬이 존재한다면
{1, 0, 0, 0, 3, 0, 0, 6, 0}과 같이 행렬을 표현하지 않고
{{1,1},1, {2,2},3, {3,2},6}과 같이 원소가 0이 아닌 원소만 표현하는 행렬을 뜻합니다.
(각 항목은 {row, column}, value를 뜻함)
행렬의 크기가 매우 커져 원소의 양보다 0의 양이 더 많아지게 된다면
0이 아닌 수만 표현함으로써 공간 절약을 할수있겠죠?
단점으로는 기본적인 덧셈만 하더라도 구현이 기존의 행렬보다 복잡해진다는
단점이있습니다.
우선 아래의 코드는 간단히 행 바꾸기와 출력을 구현한 코드입니다.
피드백 부탁드립니다.
#include<stdio.h>
#define MAX_TERMS 10
typedef struct {
int row;
int col;
int value;
}element;
typedef struct SparseMatrix {
element data[MAX_TERMS];
int rows;
int cols;
int terms;
}SparseMatrix;
SparseMatrix SMchange(SparseMatrix m, int i, int j);
void SMprint(SparseMatrix m);
int main() {
SparseMatrix m = { {{1,1,3}, {1,2,9}, {2,2,4}}, 3,3,3 };
printf("변경 전\n");
SMprint(m);
m = SMchange(m, 0, 2);
printf("변경 후\n");
SMprint(m);
}
SparseMatrix SMchange(SparseMatrix m, int i, int j) {
for (int cur = 0; cur < m.terms; cur++) {
if (m.data[cur].row == i) m.data[cur].row = j;
else if (m.data[cur].row == j) m.data[cur].row = i;
}
element e_tmp;
char sortFlag = 0;
while(true) {
if (sortFlag == 1) sortFlag = 0;
for (int j = 0; j < m.terms - 1; j++) {
if (m.data[j].row > m.data[j + 1].row) {
e_tmp = m.data[j];
m.data[j] = m.data[j + 1];
m.data[j + 1] = e_tmp;
sortFlag = 1;
break;
}
}
if (sortFlag == 0) break;
}
return m;
}
void SMprint(SparseMatrix m) {
printf("{ ");
for (int cur = 0; cur < m.terms; cur++) {
printf("( (%d, %d), %d )", m.data[cur].row, m.data[cur].col, m.data[cur].value);
if (cur != m.terms - 1) printf(", ");
}
printf(" }\n");
}
댓글 없음:
댓글 쓰기