โป ์ด ์นดํ ๊ณ ๋ฆฌ์ ๊ธ๋ค์ knu EK.Ryu ๊ต์๋์ <์๋ฃ๊ตฌ์กฐ> ์์ ์ ๋ฃ๊ณ ๋๋ฆ๋๋ก ํ์๊ฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
โป ๋ถ์กฑํ ์ค๋ช ์ด ์๊ฑฐ๋, ์๋ชป ์๊ณ ์์ฑํ ๋ถ๋ถ์ด ๋ณด์ธ๋ค๋ฉด ํธํ๊ฒ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
2.4 Polynomials
์ด ํํธ์์๋ ๋คํญ์์ ๋ง์ ์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ ์ฐ์ตํด ๋ด ์๋ค!
์๋ ์ฝ๋๋ ๋ ๊ฐ์ ๋คํญ์์ด ์ฃผ์ด์ง๋ฉด ๋ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
(1) #define๊ณผ #include ๋ถ๋ถ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 100
#define COMPARE(x, y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)
- #define MAX_TERMS 100: ๋คํญ์์์ ์ฌ์ฉํ ์ต๋ ํญ์ ๊ฐ์๋ฅผ 100์ผ๋ก ์ ์ํฉ๋๋ค.
- #define COMPARE(x, y): ๋ ๊ฐ์ ๋น๊ตํ์ฌ ์์ผ๋ฉด -1, ๊ฐ์ผ๋ฉด 0, ํฌ๋ฉด 1์ ๋ฐํํ๋ ๋งคํฌ๋ก์ ๋๋ค.
(2) polynomial ๊ตฌ์กฐ์ฒด ์ ์, terms ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด๊ณผ avail ๋ณ์
typedef struct {
float coef; // ๊ณ์ (๋คํญ์ ํญ์ ์ซ์ ๋ถ๋ถ)
int expon; // ์ง์ (๋คํญ์ ํญ์ x์ ์ง์ ๋ถ๋ถ)
} polynomial;
polynomial terms[MAX_TERMS];
int avail = 0;
- terms: ๋คํญ์ ํญ์ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด polynomial ๋ฐฐ์ด์ ๋๋ค. ํฌ๊ธฐ๋ MAX_TERMS๋ก ์ ์๋ 100์ ๋๋ค.
- avail: ํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ๋ณ์์ ๋๋ค. ์๋ก์ด ํญ์ ์ถ๊ฐํ ๋ ์ด ๋ณ์๊ฐ ์ฆ๊ฐํฉ๋๋ค.
(3) attach ํจ์
void attach(float coefficient, int exponent) {
if (avail >= MAX_TERMS) {
fprintf(stderr, "Too many terms in the polynomial\n");
exit(1);
}
terms[avail].coef = coefficient;
terms[avail++].expon = exponent;
}
- ์๋ก์ด ํญ์ ๋คํญ์ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ ํจ์์ ๋๋ค.
- ๋ง์ฝ ๋ฐฐ์ด์ ๋ ์ด์ ํญ์ ์ถ๊ฐํ ์ ์์ผ๋ฉด ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํฉ๋๋ค.
- terms[avail]์ ํญ์ ์ถ๊ฐํ๊ณ avail์ 1 ์ฆ๊ฐ์ํต๋๋ค.
(4) padd ํจ์ (๋คํญ์ ๋ง์ โจ)
void padd(int startA, int finishA, int startB, int finishB, int* startD, int* finishD) {
float coefficient;
*startD = avail;
while (startA <= finishA && startB <= finishB) {
switch (COMPARE(terms[startA].expon, terms[startB].expon)) {
case -1:
attach(terms[startB].coef, terms[startB].expon);
startB++;
break;
case 0:
coefficient = terms[startA].coef + terms[startB].coef;
if (coefficient)
attach(coefficient, terms[startA].expon);
startA++;
startB++;
break;
case 1:
attach(terms[startA].coef, terms[startA].expon);
startA++;
}
}
for (; startA <= finishA; startA++)
attach(terms[startA].coef, terms[startA].expon);
for (; startB <= finishB; startB++)
attach(terms[startB].coef, terms[startB].expon);
*finishD = avail - 1;
}
- ์ฒซ ๋ฒ์งธ ๋คํญ์์ ์์๊ณผ ๋์ startA, finishA๋ก, ๋ ๋ฒ์งธ ๋คํญ์์ ์์๊ณผ ๋์ startB, finishB๋ก ๋ํ๋ ๋๋ค.
- ๋ ๋คํญ์์ ๋ฏ๋ ๊ฒฐ๊ณผ ๋คํญ์์ ์์๊ณผ ๋ ์ธ๋ฑ์ค๋ฅผ *startD์ *finishD์ ์ ์ฅํฉ๋๋ค. ์ด ๋ ๋ณ์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ํจ์ ์ธ๋ถ์์ ์ ์ธ๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- COMPARE ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋ ํญ์ ์ง์๋ฅผ ๋น๊ตํ๊ณ , ํ ๋คํญ์์ด ๋จผ์ ๋๋๋ฉด ๋๋จธ์ง ๋คํญ์์ ํญ๋ค์ ๊ทธ๋๋ก ๊ฒฐ๊ณผ ๋คํญ์์ ์ถ๊ฐํฉ๋๋ค.
(5) print_polynomial ํจ์
void print_polynomial(int start, int finish) {
for (int i = start; i <= finish; i++) {
if (i > start && terms[i].coef > 0) printf("+ ");
printf("%fx^%d ", terms[i].coef, terms[i].expon);
}
printf("\n");
}
- ๋คํญ์์ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
- start๋ถํฐ finish๊น์ง์ ํญ์ ์ถ๋ ฅํ๋ฉฐ, ์์์ธ ํญ ์์๋ +๋ฅผ ๋ถ์ฌ ์ถ๋ ฅํฉ๋๋ค.
(6) main ํจ์
int main() {
attach(4, 3);
attach(3, 2);
attach(5, 0);
attach(3, 3);
attach(1, 2);
attach(2, 1);
int startD, finishD;
padd(0, 2, 3, 5, &startD, &finishD);
print_polynomial(startD, finishD);
return 0;
}
- ์ฒซ ๋ฒ์งธ ๋คํญ์ (4x³ + 3x² + 5)์ ๋ ๋ฒ์งธ ๋คํญ์ (3x³ + 1x² + 2x)์ ๋ฐฐ์ด์ ์ถ๊ฐํฉ๋๋ค.
- ๋ ๋คํญ์์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ padd ํจ์๋ก ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
2.5 Sparse matrices
Sparse matrix๋ ๋ง์ ์์๊ฐ 0์ผ๋ก ์ด๋ฃจ์ด์ง ํ๋ ฌ์ ๋งํฉ๋๋ค. ํ๋ ฌ์ ๋๋ถ๋ถ์ ์์๊ฐ 0์ธ ๊ฒฝ์ฐ, ๋ชจ๋ ์์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ฐ ํจ์จ ์ธก๋ฉด์์ ๋นํจ์จ์ ์ ๋๋ค. ๋ฐ๋ผ์, sparse matrix๋ 0์ด ์๋ ์์๋ง์ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
์ด๋ฒ์๋ 0์ด ์๋ ์์๊ฐ ๋ด๊ฒจ ์๋ ํ๊ณผ ์ด, ๊ฐ์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ผ๋ก ๊ตฌํํ์ต๋๋ค.
#define MAX-TERMS 101 /* maximum number of terms +1*/
typedef struct {
int col;
int row;
int value;
} term;
term a[MAX-TERMS];
(1) ์ ์น ํ๋ ฌ ๋ฐฉ๋ฒ1 (๋นํจ์จ์ ์ธ ์๊ฐ๋ณต์ก๋)
#define CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 101
typedef struct {
int col;
int row;
int value;
} term;
term a[MAX_TERMS];
term b[MAX_TERMS];
void transpose(term a[], term b[])
{
int n, i, j, currentb;
n = a[0].value;
b[0].row = a[0].col;
b[0].col = a[0].row;
b[0].value = n;
if (n > 0)
{
currentb = 1;
for (i = 0; i < a[0].col; i++)
for (j = 1; j <= n; j++)
if (a[j].col == i)
{
b[currentb].row = a[j].col;
b[currentb].col = a[j].row;
b[currentb].value = a[j].value;
currentb++;
}
}
}
void printMatrix(term a[])
{
int n, i;
n = a[0].value;
printf("row col value\n");
for (i = 0; i <= n; i++)
printf("%d %d %d\n", a[i].row, a[i].col, a[i].value);
}
int main()
{
a[0].row = 6;
a[0].col = 6;
a[0].value = 8;
a[1].row = 0;
a[1].col = 0;
a[1].value = 15;
a[2].row = 0;
a[2].col = 3;
a[2].value = 22;
a[3].row = 0;
a[3].col = 5;
a[3].value = -15;
a[4].row = 1;
a[4].col = 1;
a[4].value = 11;
a[5].row = 1;
a[5].col = 2;
a[5].value = 3;
a[6].row = 2;
a[6].col = 3;
a[6].value = -6;
a[7].row = 4;
a[7].col = 0;
a[7].value = 91;
printf("Matrix A\n");
printMatrix(a);
transpose(a, b);
printf("Matrix B\n");
printMatrix(b);
return 0;
}
- ์ด ์ฝ๋์์ transpose() ํจ์๋ฅผ ์ดํด๋ด ์๋ค.
- ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์์๋ ์๋ณธ ํ๋ ฌ์ ์ด์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์คํํ๊ณ , ๋ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์์๋ ์๋ณธ ํ๋ ฌ์ ๋ชจ๋ ๊ฐ๋ค(๋น - 0์ธ ์์)์ ๋ํด์ ์คํํฉ๋๋ค.
- ์ฆ, ์๊ฐ๋ณต์ก๋๋ O(n*m) ์ ๋๋ค.
- ์กฐ๊ธ ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์์๊น์?
(2) ์ ์น ํ๋ ฌ ๋ฐฉ๋ฒ2 (ํจ์จ์ ์ธ ์๊ฐ๋ณต์ก๋)
void fasttranspose(term a[], term b[])
{
int row_terms[MAX_TERMS], starting_pos[MAX_TERMS];
int i, j, num_cols = a[0].col, num_terms = a[0].value;
b[0].row = num_cols;
b[0].col = a[0].row;
b[0].value = num_terms;
if (num_terms > 0)
{
for (i = 0; i < num_cols; i++)
row_terms[i] = 0;
for (i = 1; i <= num_terms; i++)
row_terms[a[i].col]++;
starting_pos[0] = 1;
for (i = 1; i < num_cols; i++)
starting_pos[i] = starting_pos[i - 1] + row_terms[i - 1];
for (i = 1; i <= num_terms; i++)
{
j = starting_pos[a[i].col]++;
b[j].row = a[i].col;
b[j].col = a[i].row;
b[j].value = a[i].value;
}
}
}
- ๋จผ์ , 1์ฐจ์ ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ์ ์ธํฉ๋๋ค. (row_terms, starting_pos)
- row_terms๋ i ์ด์ ๋ช ๊ฐ์ ๊ฐ์ด ์๋์ง๋ฅผ ์ ์ฅํ๊ณ , starting_pos๋ ๊ฐ i์ด์ด ์ ์น๋ ํ๋ ฌ์์ ๋ช ๋ฒ์งธ ์์น์์ ์์ํ๋์ง๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์ด ๋ฐฐ์ด์ ๋ฐ๋ณต๋ฌธ์ ํตํด ๋จผ์ ์์ฑํจ์ผ๋ก์จ, ์ ์น๋ ํ๋ ฌ ์์ ์ ์ํํ ๋ ํ๋์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์๊ฐ๋ณต์ก๋๋ O(numCol + numTerms)์ผ๋ก, ์ด์ ์ฝ๋๋ณด๋ค ํจ์จ์ ์ ๋๋ค.
2.6 Representation of Multidimensional Arrays
๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์ฃผ์ ์์น๋ฅผ a๋ผ๊ณ ํ๋ฉด, ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํน์ ์์๊น์ง ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง๋ฅผ ์ ์ ์์ต๋๋ค.
'๐CS > ๐Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] hw1 ์ ๊ทผ ํ๊ธฐ๋ฒ ์ฆ๋ช (0) | 2024.10.15 |
---|---|
[์๋ฃ๊ตฌ์กฐ] Chapter3. STACKS AND QUEUES(2) (0) | 2024.10.15 |
[์๋ฃ๊ตฌ์กฐ] Chapter3. STACKS AND QUEUES(1) (2) | 2024.10.05 |
[์๋ฃ๊ตฌ์กฐ] Chapter2. Arrays and Structures(1) (0) | 2024.10.01 |