자료 구조: Chapter 3 배열(1) 2017. 3. 23 순천향대학교 컴퓨터공학과 하 상 호.

Slides:



Advertisements
Similar presentations
3 학년 문제가 남느냐, 내가 남느냐 1. ( 아씨방 일곱 동무 ) 아씨의 방에는 바느질을 위한 친구가 몇 명이 있었나요 ? 정답은 ? 일곱.
Advertisements

스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
머리가 좋아지는 IQ퀴즈 (1탄).
소규모 합병 공고 주식회사 포스코는 주식회사 포스하이메탈과 2015년 12월23일 합병계약을
제 2 장 : 배열과 구조 이 형 원 강릉대학교 컴퓨터공학과
배열과 ADT(1/2) 연속된 메모리 위치의 집합 <index, value>쌍의 집합
Chapter 2 배열과 구조 (Arrays and Structures)
2장의 주요 문제 수요란 무엇인가? 공급이란 무엇인가? 가격과 거래량은 어떻게 결정되는가? 수요와 공급의 변화는 가격과 거래량에 어떤 영향을 미치는가?
제 3 장 변수와 자료형.
CHAP 1:자료구조와 알고리즘.
구약 파노라마 대구북부교회.
제2장 배열과구조.
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
수치해석 (Numerical Analysis)
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
소규모 합병 공고 주식회사 포스코는 포스코그린가스텍 주식회사와 2016년 2월26일 합병계약을
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
제 2 장 배열과 스트링.
제2장 배열과구조.
데이터 구조 - 소개 순천향대학교 컴퓨터공학과 하 상 호.
시스템 생명 주기(System Life Cycle)(1/2)
배열과 ADT(1/2) 연속된 메모리 위치의 집합 <index, value>쌍의 집합
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
8. 객체와 클래스 (기본).
CHAP 10:그래프 순천향대학교 하상호.
Chapter 03 배열, 구조체, 포인터.
시스템 생명 주기(System Life Cycle)(1/2)
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
자료 구조: Chapter 3 배열(1) 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 3:배열, 구조체, 포인터.
스택(stack) SANGJI University Kwangman Ko
제 3 장. 배열과 구조체 및 포인터.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
HW#2 #1과 동일한 방법으로 argc와 argv를 사용함
강의 #6 큐(Queue).
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 27).
CHAP 6:큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
다음 주 과제 7장 읽어오기 숙제 해서 다음 주(11월 12일) 제출하기. 큐(Queue) E304호,
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 28)
4 병행 프로세스와 상호배제.
안전한 생활 교과용도서의 이해 2015 개정 교육과정 초등학교 1~2학년군 (화)
CHAP 11: 해싱 순천향대학교 하상호.
프로그래밍 보고서 작성법 순천향대학교 컴퓨터공학과 하 상 호.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
5주차 실습 - solution.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Chapter 04 리스트.
2. 상호배제와 동기화 01 program versionone; // 첫 번째 버전
[CPA340] Algorithms and Practice Youn-Hee Han
4장 - PHP의 표현식과 흐름 제어-.
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
제 3 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
자료구조: CHAP 7(2) 트리 순천향대학교 컴퓨터공학과 하 상 호.
자바 5.0 프로그래밍.
CHAP 8:우선순위큐.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
adopted from KNK C Programming : A Modern Approach
데이터 구조 - 소개 순천향대학교 컴퓨터공학과 하 상 호.
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
Report #4 (1) (due 4/4) 문제 #1 3개의 막대 A, B, C와 원판 n개를 전달받아 Hanoi 탑 문제를 해결하는데 필요한 원판의 이동 회수를 구하여 반환하는 hanoi_tower(n, A, B, C)를 작성하라. 여기서 원판 n은 막대 A에 쌓여 있고.
어서와 C언어는 처음이지 제16장.
DataScience Lab. 박사과정 김희찬 (화)
정다면체의 종류 옥천초등학교 6학년 김태관 지도교사 최 두 현.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
보고서 #4 (1) (제출기한: 10/6) #1 다음 그래프 G에 대해서 답하시오. (2*5 = 10)
Presentation transcript:

자료 구조: Chapter 3 배열(1) 2017. 3. 23 순천향대학교 컴퓨터공학과 하 상 호

3장 목차 행렬 구조체 포인터

배열이란? 동일한 데이터 타입의 자료를 다룰 때 유용 반복 구조를 이용한 효과적인 배열 조작 int A0, A1, A2, A3, …,A9; int A[10]; 1 2 3 4 5 6 7 8 9

배열 ADT 배열: <인덱스, 요소> 쌍들의 집합 인덱스가 주어지면 해당되는 요소가 대응되는 구조 배열 ADT 객체: <i ∈ Index, e ∈ Element> 쌍들의 집합 여기서 Index는 순서를 나타내는 원소의 유한 집합 Element는 타입이 동일하고 순서가 있는 원소들의 집합 연산:   ▪ create(n) ::= n개의 요소를 가진 배열의 생성.  ▪ retrieve(a, i) ::= if (i ∈ Index) then return e where <i,e> ∈a else return error  ▪ store(a, i, item) ::= if (i ∈ Index) then return (a ∪<i,item>)

배열의 응용: 다항식 다항식의 일반적인 형태 프로그램상에서 다항식을 어떻게 표현할 것인가? 다항식은 항들의 모임 각 항의 표현은?

다항식 표현 방법 #1 10 6 3 다항식을 배열에 표현 모든 차수에 대한 계수값을 배열에 저장 변수 degree상에 몇 차식인지 표현 coef 10 6 3 1 2 4 5 7 8 9 degree 이를 표현하기 위한 적절한 자료 구조는? 5

다항식 표현 방법 #1 10 6 3 C 프로그램에서 다항식 표현은? => 구조체 (degree, coef)로 coef 1 6 3 1 2 4 5 7 8 9 degree 5 type poly = record degree: integer; // 최고 차수 coef: array [1..maxdegree] of real; // 계수들을 순차적으로 저장 end;

poly_add() 예제 p=8x3+7x+1, q=10x3+3x2+1 p, q의 표현은? p, q의 덧셈 결과 다항식을 r이라 할 때, r은?

poly_add() 예제 p1=2x4 +8x3+7x+1, p2=10x3+3x2 p, q의 표현은? p, q의 덧셈 결과 다항식을 r이라 할 때, r은?

poly_add(): 알고리즘 알고리즘 type poly = record degree: integer; coef: array of [1..maxdegree] of real; end; procedure poly_add(p, q: poly) // 동일 차수의 항을 순서대로 가져와서 더한다 end poly_add

poly_add(): 알고리즘 알고리즘 type poly = record degree: integer; coef: array of [1..maxdegree] of real; end; procedure poly_add(p, q: poly) : poly r: poly; r.degree <- max(p.degree, q.degree); // r의 차수 설정 dp <- p.degree; dq<- q.degree // p, q의 현재 차수 설정 ip <- 0; iq<- 0; ir <-0; // p, q의 현재 인덱스 설정 while dp >= 0 and dq >= 0 do // 검사할 항이 남아 있으면 if dp = dq then r.coef[rf] <- p.coef[pf] + q.coef[qf]; ir++; ip++; iq++; // 인덱스 갱신 dp <- dp – 1; dq <- dq -1; // 차수 갱신 else if dp > dq then r.coef[rf] <- p.coef[pf]; ir++, ip++; dp <- dp – 1; else r.coef[rf] <- q.coef[qf]; ir++, iq++; dq <- dq – 1; end if repeat return r end poly_add 알고리즘

poly_add(): C 코드 다항식 표현 type poly = record degree: integer; coef: array of [1..maxdegree] of real; end; typedef struct { int degree; float coef[MAX_DEGREE]; } poly;

poly_add(): C 코드 (프로그램 3.2) polynonial polyAdd(polynomial A, polynomial B) { polynomial C; int Apos = Bpos = Cpos = 0; // 현재 배열 위치 int degree_a = A.degree, degree_b = B.degree; // 현재 차수 int C.degree = MAX(A.degree, B.degree); // 결과 다항식 차수 while ( Apos<=A.degree && Bpos<=B.degree ) { if( degree_a > degree_b ) { C.coef[Cpos++]= A.coef[Apos++]; degree_a--; } else if( degree_a == degree_b ){ C.coef[Cpos++]=A.coef[Apos++]+B.coef[Bpos++]; degree_a--; degree_b--; else { C.coef[Cpos++]= B.coef[Bpos++]; degree_b--; return C;

다항식 표현 방법 #1 평가 장점: 다항식의 연산이 간단 단점: 대부분의 항의 계수가 0이면 공간의 낭비가 심함. Ex 다음 다항식을 표현하면? 10x100+6

다항식 표현 방법 #2 다항식에서 0이 아닌 항만을 배열에 저장하면?

다항식 표현 방법 #2 다항식에서 항의 정보 (계수, 차수)를 배열에 저장 Ex. 10x5+6x+3 10x100+6

다항식 표현 방법 #2 하나의 배열에 여러 개의 다항식을 표현하는 것이 가능 3 8 1 7 10 2 4 5 6 9 A B 10 2 4 5 6 9 A B avail coef expon terms

다항식 표현 방법 #2(계속) 다항식의 연산은? (예) 다항식의 덧셈: A=8x3+7x+1, B=10x3+3x2+1 => C=A+B 3 8 1 7 10 2 4 5 6 9 A B avail coef expon 18 C

다항식 연산 #2: 덧셈 덧셈 알고리즘 A, B의 다항식을 더하여 다항식 C를 구한다고 가정 (A, B의 각 항들은 (차수, 계수)로 표현되고, 높은 차수부터 저장되어 있음) 순서대로 A, B의 각 항의 지수를 비교하여 두 지수가 같으면 A, B의 해당 항의 계수를 더하여 C로 이동 두 지수가 다르면, 지수가 큰 항을 C로 이동 어느 한쪽의 다항식의 항이 모두 소진되면 다른 다항식에 남아 있는 모든 항들을 C로 이동 Ex. A=2x4 +8x3+7x+1, B=10x3+3x2+1

poly_add2() 2개의 타입 poly, term_type 정의 type poly = record terms: array [1..maxterms] of term_type; // 항의 정보 num: integer; // 항의 개수 end; type term_type = record coef: real; // 계수 expo: integer; // 차수

poly_add2() 예제 p=8x3+7x+1, q=10x3+3x2+1 p, q의 표현은? type poly = record terms: array [1..maxterms] of term_type; num: integer; end; type term_type = record coef: real; expo: integer; poly_add2() 예제 p=8x3+7x+1, q=10x3+3x2+1 p, q의 표현은? p, q의 덧셈 결과 다항식을 r이라 할 때, r은?

poly_add2() 예제 p1=2x4 +8x3+7x+1, p2=10x3+3x2 p, q의 표현은? type poly = record terms: array [1..maxterms] of term_type; num: integer; end; type term_type = record coef: real; expo: integer; poly_add2() 예제 p1=2x4 +8x3+7x+1, p2=10x3+3x2 p, q의 표현은? p, q의 덧셈 결과 다항식을 r이라 할 때, r은?

poly_add2(): 알고리즘 알고리즘 type poly = record terms: array [1..maxterms] of term_type; num: integer; end; type term_type = record coef: real; expo: integer; 알고리즘 procedure poly_add2(p, q: poly): poly r: poly; // p, q의 항(계수,차수)을 순서대로 한 개씩 가져와서 적절하게 덧셈 수행 // 차수가 동일한 항만을 더함 end poly_add2

poly_add2(): 알고리즘 알고리즘 procedure poly_add2(p, q: poly) : poly r: poly; ip <- 0; iq<- 0; ir <-0; // 다항식의 현재 항 인덱스 설정 while ip < p.num and iq < q.num do if p.terms[ip].expo = q.terms[iq].expo then r.terms[ir].coef <- p.terms[ip].coef + q.terms[iq].coef; r.terms[ir].expo <- p.terms[ip].expo; ir++; ip++; iq++; // 인덱스 갱신 else if p.terms[ip].expo > q.terms[iq].expo then r.terms[ir].coef <- p.terms[ip].coef; ir++; ip++; else r.terms[ir].coef <- p.terms[iq].coef; r.terms[ir].expo <- p.terms[iq].expo; ir++; iq++; end if repeat // 어느 한 쪽이 먼저 소진된 경우 처리 if ip < p.num then // p의 나머지 항들을 r로 이동 // q의 나머지 항들을 r로 이동 endif end poly_add2 알고리즘 type poly = record terms: array [1..maxterms] of term_type; num: integer; end; type term_type = coef: real; expo: integer;

희소행렬(sparse matrix) 배열을 이용하여 행렬(matrix)를 표현하는 2가지 방법 (1) 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 (2) 0이 아닌 요소들만 저장하는 방법 희소행렬: 대부분의 항들이 0인 배열

희소행렬 표현#1 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 A= B= 장점: 행렬의 연산들을 간단하게 구현할 수 있다. 단점: 대부분의 항들이 0인 희소 행렬의 경우 많은 메모리 공간 낭비 2 1 5 4 6 3 9 8 7 7 8 9 5 1 2 3 A= B=

희소행렬 표현#2 0이 아닌 요소들만 (행, 열, 값)의 요소 형식으로 저장하는 방법 A= B= 장점: 희소 행렬의 경우, 메모리 공간의 절약 단점: 각종 행렬 연산들의 구현이 복잡해진다. => 프로그래밍 필요 2 5 6 7 1 4 9 3 8 행 열 값 A= B=

프로그램: 희소행렬 표현 #define MAX_TERMS 10 typedef struct { // 행렬 원소 표현 int row; int col; int value; } element; typedef struct sparse_matrix { // 희소 행렬 표현 element data[MAX_TERMS]; int rows; // 행의 크기 int cols; // 열의 크기 int terms; // 0이 아닌 항의 개수 } sparse_matrix;

희소행렬 표현방법 2개의 희소 행렬 A, B를 더하여 C에 할당하는 프로그램 고려(A, B의 각 요소들은 (행, 열, 값)으로 표현되고, 행*열크기+열은 원래 행렬에서 그 원소의 인덱스를 나타냄 먼저 A, B의 각 행, 열의 크기가 동일해야 함 (이를 검사할 것) 다항식의 항(표현방법 #2)들을 더하는 것과 유사 A, B의 두 요소의 인덱스가 같으면 두 요소의 값을 더하여 C로 이동 인덱스가 서로 다르면, 앞선 인덱스를 갖는 요소를 C로 이동 어느 한쪽 행렬 요소가 소진되면, 다른 행렬의 나머지 요소들을 C로 이동

희소행렬 덧셈 알고리즘 #define MAX_TERMS 10 typedef struct { // 행렬 원소 표현 int row; int col; int value; } element; typedef struct sparse_matrix { // 희소 행렬 표현 element data[MAX_TERMS]; int rows; // 행의 크기 int cols; // 열의 크기 int terms; // 0이 아닌 항의 개수 } sparse_matrix; procedure sparse_matrix_add2(p, q: sparse_matrix) : sparse_matrix // p, q의 행, 열의 크기가 동일한지 검사 // p, q의 각 항을 순서대로 가져와서 동일 인덱스인지 검사하여 덧셈 수행 end sparse_matrix_add2