CHAP 1:자료구조와 알고리즘.

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
컴퓨터와 인터넷.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
CHAP 1:자료구조와 알고리즘.
(Program = Algorithm + Data Structure)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
자료구조 (Data Structures)
Data Structure & Algorithms
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
CHAP 1:자료구조와 알고리즘 순천향대학교 컴퓨터공학과 하 상 호.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Chapter 02 순환 (Recursion).
5장. 참조 타입.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2012.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
23장. 구조체와 사용자 정의 자료형 2.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 28)
CHAP 1:자료구조와 알고리즘.
6장. printf와 scanf 함수에 대한 고찰
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
11장. 1차원 배열.
C#.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
Chap 6.Assembler 유건우.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
다음 주 과제 3장 읽어오기 숙제 해서 제출하기. 자료구조와 알고리즘, 순환 E304호,
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Chapter 01 자료 구조와 알고리즘.
Chap. 1 Data Structure & Algorithms
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
CHAP 1:자료구조와 알고리즘.
알고리즘 알고리즘이란 무엇인가?.
Data Structure & Algorithms
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
쉽게 배우는 알고리즘 2장. 점화식과 점근적 복잡도 분석
TVM ver 최종보고서
발표자 : 이지연 Programming Systems Lab.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
C로 만드는 자료구조.
7 생성자 함수.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

CHAP 1:자료구조와 알고리즘

일상생활에서의 사물의 조직화 조직도 해야할일 리스트 일상생활에서의 사물의 조직화 사전 Ticket Box

일상생활과 자료구조의 비교 Ticket Box 해야할일 리스트 C B A a b c NULL 전단(front) 후단(rear) 일상생활에서의 예 자료구조 물건을 쌓아두는 것 스택 영화관 매표소의 줄 큐 할일 리스트 리스트 영어사전 사전, 탐색구조 지도 그래프 조직도 트리

자료구조와 알고리즘 … 프로그램 = 자료구조 + 알고리즘 (예) 최대값 탐색 프로그램 = 배열+ 순차탐색 자료구조 알고리즘 score[] 80 70 90 … 30 tmp←score[0]; for i ← 1 to n do if score[i]>tmp then tmp←score[i];

박철수의 전화번호는 바로 ㅂ부근으로 넘기면 찾을 수 있겠군 알고리즘 알고리즘(algorithm): 컴퓨터로 문제를 풀기 위한 단계적인 절차 알고리즘의 조건 입 력 : 0개 이상의 입력이 존재하여야 한다. 출 력 : 1개 이상의 출력이 존재하여야 한다. 명백성 : 각 명령어의 의미는 모호하지 않고 명확해야 한다. 유한성 : 한정된 수의 단계 후에는 반드시 종료 되어야 한다. 유효성 : 각 명령어들은 실행 가능한 연산이어야 한다. 박철수의 전화번호는 바로 ㅂ부근으로 넘기면 찾을 수 있겠군

알고리즘의 기술 방법 영어나 한국어와 같은 자연어 흐름도(flow chart) 유사 코드(pseudo-code) (예) 배열에서 최대값 찾기 알고리즘 1 2 3 4 5 6 7 8 9 10

자연어로 표기된 알고리즘 인간이 읽기가 쉽다. 그러나 자연어의 단어들을 정확하게 정의하지 않으면 의미 전달이 모호해질 우려가 있다. (예) 배열에서 최대값 찾기 알고리즘 ArrayMax(A,n) 배열 A의 첫번쨰 요소를 변수 tmp에 복사 배열 A의 다음 요소들을 차례대로 tmp와 비교하면 더 크면 tmp로 복사 배열 A의 모든 요소를 비교했으면 tmp를 반환

흐름도로 표기된 알고리즘 직관적이고 이해하기 쉬운 알고리즘 기술 방법 그러나 복잡한 알고리즘의 경우, 상당히 복잡해짐. tmp←A[0] i←1 i < n A[i]>tmp tmp←A[i] tmp no yes i++

유사코드로 표현된 알고리즘 알고리즘의 고수준 기술 방법 자연어보다는 더 구조적인 표현 방법 프로그래밍 언어보다는 덜 구체적인 표현방법 알고리즘 기술에 가장 많이 사용 프로그램을 구현할 때의 여러 가지 문제들을 감출 수 있다. 즉 알고리즘의 핵심적인 내용에만 집중할 수 있다. ArrayMax(A,n) tmp ← A[0]; for i←1 to n-1 do if tmp < A[i] then tmp ← A[i]; return tmp; 대입 연산자가 ←임을 유의

C로 표현된 알고리즘 알고리즘의 가장 정확한 기술이 가능 반면 실제 구현 시, 많은 구체적인 사항들이 알고리즘의 핵심적인 내용에 대한 이해를 방해할 수 있다. #define MAX_ELEMENTS 100 int score[MAX_ELEMENTS]; int find_max_score(int n) { int i, tmp; tmp=score[0]; for(i=1;i<n;i++){ if( score[i] > tmp ){ tmp = score[i]; } return tmp;

데이터 타입, 추상 데이터 타입 데이터 타입(data type) (예) 데이터의 집합과 연산의 집합 (예) 추상 데이터 타입(ADT: Abstract Data Type) 데이터 타입을 추상적(수학적)으로 정의한 것 데이터나 연산이 무엇(what)인가는 정의되지만 데이터나 연산을 어떻게(how) 컴퓨터 상에서 구현할 것인지는 정의되지 않는다. int 데이터 타입 데이터: { …,-2,-1,0,1,2,…} 연산: +, -, /, *, %

추상 데이터 타입의 정의 객체: 추상 데이터 타입에 속하는 객체가 정의된다. 연산: 이들 객체들 사이의 연산이 정의된다. 이 연산은 추상 데이터 타입과 외부를 연결하는 인터페이스의 역할을 한다. 2 3 객체 9 7 연산 8 추상 데이터 타입

추상 데이터 타입의 예: 자연수 Nat_No 객체: 0에서 시작하여 INT_MAX까지의 순서화된 정수의 부분범위 연산: zero() ::= return 0; is_zero() ::= if (x) return FALSE; else return TRUE; add(x,y) ::= if( (x+y) <= INT_MAX ) return x+y; else return INT_MAX sub(x,y) ::= if ( x<y ) return 0; else return x-y; equal(x,y)::= if( x=y ) return TRUE; else return FALSE; successor(x)::= if( (x+y) <= INT_MAX ) return x+1;

추상 데이터 타입과 VTR ▪사용자들은 추상 데이터 타입이 제공하는 연산만을 사용할 수 있다. ▪사용자들은 추상 데이터 타입을 어떻게 사용하는지를 알아야 한다. ▪사용자들은 추상 데이터 타입 내부의 데이터를 접근할 수 없다. ▪사용자들은 어떻게 구현되었는지 몰라도 이용할 수 있다. ▪만약 다른 사람이 추상 데이터 타입의 구현을 변경하더라도 인터페이스가 변경되지 않으면 사용할 수 있다. ▪VCR의 인터페이스가 제공하는 특정한 작업만을 할 수 있다. ▪사용자는 이러한 작업들을 이해해야 한다. 즉 비디오를 시청하기 위해서는 무엇을 해야 하는지를 알아야 한다. ▪VCR의 내부를 볼 수는 없다. ▪VCR의 내부에서 무엇이 일어나고 있는지 몰라도 이용할 수 있다. ▪누군가가 VCR의 내부의 기계장치를 교환한다고 하더라도 인터페이스만 바뀌지 않는 한 그대로 사용이 가능하다.

알고리즘의 성능분석 알고리즘의 성능 분석 기법 수행 시간 측정 알고리즘의 복잡도 분석 두개의 알고리즘의 실제 수행 시간을 측정하는 것 실제로 구현하는 것이 필요 동일한 하드웨어를 사용하여야 함 알고리즘의 복잡도 분석 직접 구현하지 않고서도 수행 시간을 분석하는 것 알고리즘이 수행하는 연산의 횟수를 측정하여 비교 일반적으로 연산의 횟수는 n의 함수 시간 복잡도 분석: 수행 시간 분석 공간 복잡도 분석: 수행시 필요로 하는 메모리 공간 분석

수행시간측정 컴퓨터에서 수행시간을 측정하는 방법에는 주로 clock 함수가 사용된다. clock_t clock(void); clock 함수는 호출되었을 때의 시스템 시각을 CLOCKS_PER_SEC 단위로 반환 수행시간을 측정하는 전형적인 프로그램 #include <stdio.h> #include <stdlib.h> #include <time.h> void main( void ) {    clock_t start, finish;    double  duration;    start = clock();     // 수행시간을 측정하고 하는 코드....      // ....    finish = clock();    duration = (double)(finish - start) / CLOCKS_PER_SEC;    printf("%f 초입니다.\n", duration); }

복잡도 분석 시간 복잡도는 알고리즘을 이루고 있는 연산들이 몇 번이나 수행되는지를 숫자로 표시 산술 연산, 대입 연산, 비교 연산, 이동 연산의 기본적인 연산: 수행시간이 입력의 크기에 따라 변하면 안됨: 기본적인 연산만 알고리즘이 수행하는 연산의 개수를 계산하여 두 개의 알고리즘을 비교할 수 있다. 연산의 수행횟수는 고정된 숫자가 아니라 입력의 개수 n에 대한 함수->시간복잡도 함수라고 하고  T(n) 이라고 표기한다. 프로그램 A 프로그램 B 워드2005 워드2000 연산의 수 =26 5n2 +6 연산의 수 = 8 3n+2

복잡도 분석의 예 n을 n번 더하는 문제: 각 알고리즘이 수행하는 연산의 개수를 세어 본다. 각 알고리즘이 수행하는 연산의 개수를 세어 본다. 단, for 루프 제어 연산은 고려하지 않음. 알고리즘 A 알고리즘 B 알고리즘 C sum ←n*n; sum ← 0; for i ← 1 to n do    sum ←sum + n; for i←1 to n do   for ←1 to n do     sum ←sum + 1;   알고리즘 A 알고리즘 B 알고리즘 C 대입연산 1    n + 1      n*n + 1      덧셈연산   n     n*n      곱셈연산 나눗셈연산 전체연산수 2   2n + 1      2n2 + 1   

연산의 횟수를 그래프로 표현 연산의 횟수 알고리즘 C 알고리즘 B 알고리즘 A 입력의 개수 n

시간복잡도 함수 계산 예 코드를 분석해보면 수행되는 수행되는 연산들의 횟수를 입력 크기의 함수로 만들 수 있다. ArrayMax(A,n) tmp ← A[0]; 1번의 대입 연산 for i←1 to n-1 do 루프 제어 연산은 제외 if tmp < A[i] then n-1번의 비교 연산 tmp ← A[i]; n-1번의 대입 연산(최대) return tmp; 1번의 반환 연산 총 연산수= 2n(최대)

빅오 표기법 n=1000인 경우 T(n)= n2 + n + 1 99% 1% 자료의 개수가 많은 경우에는 차수가 가장 큰 항이 가장 영향을 크게 미치고 다른 항들은 상대적으로 무시될 수 있다. (예)  n=1,000 일 때, T(n)의 값은 1,001,001이고 이중에서 첫 번째 항인 의 값이 전체의 약 99%인 1,000,000이고 두 번째 항의 값이 1000으로 전체의 약 1%를 차지한다. 따라서 보통 시간복잡도 함수에서 가장 영향을 크게 미치는 항만을 고려하면 충분하다. n=1000인 경우 T(n)= n2 + n + 1 99% 1% 입력의 개수 n

빅오 표기법 빅오표기법: 연산의 횟수를 대략적(점근적)으로 표기한 것 두개의 함수 f(n)과 g(n)이 주어졌을 때, 모든 n≥n0에 대하여 |f(n)| ≤ c|g(n)|을 만족하는 2개의 상수 c와 n0가 존재하면 f(n)=O(g(n))이다. 빅오는 함수의 상한을 표시한다. (예) n≥5 이면 2n+1 <10n 이므로 2n+1 = O(n) 연산의 횟수 입력의 개수 n

빅오 표기법의 예

빅오 표기법의 종류 O(1) : 상수형 O(logn) : 로그형 O(n) : 선형 O(nlogn) : 로그선형 O(nk) : k차형 O(2n) : 지수형 O(n!) : 팩토리얼형

빅오 표기법의 종류 시간복잡도 n 1 2 4 8 16 32 logn 3 5 nlogn 24 64 160 n2 256 1024 3 5 nlogn 24 64 160 n2 256 1024 n3 512 4096 32768 2n 65536 4294967296 n! 40326 20922789888000 26313×1033

빅오 표기법이외의 표기법 빅오메가 표기법 모든 n≥n0에 대하여 |f(n)| ≥ c|g(n)|을 만족하는 2개의 상수 c와 n0가 존재하면 f(n)=Ω(g(n))이다. 빅오메가는 함수의 하한을 표시한다. (예) n ≥ 5 이면 2n+1 <10n 이므로 n = Ω(n) . 입력의 개수 n 연산의 수 상한 하한

빅오 표기법이외의 표기법 빅세타 표기법 모든 n≥n0에 대하여 c1|g(n)| ≤ |f(n)| ≤ c2|g(n)|을 만족하는 3개의 상수 c1, c2와 n0가 존재하면 f(n)=θ(g(n))이다. 빅세타는 함수의 하한인 동시에 상한을 표시한다. f(n)=O(g(n))이면서 f(n)= Ω(g(n))이면 f(n)= θ(n)이다. (예) n ≥ 1이면 n ≤ 2n+1 ≤ 3n이므로 2n+1 = θ(n) . 입력의 개수 n 연산의 수 상한 하한

최선, 평균, 최악의 경우 알고리즘의 수행시간은 입력 자료 집합에 따라 다를 수 있다. (예) 정렬 알고리즘의 수행 시간은 입력 집합에 따라 다를 수 있다. 최선의 경우(best case): 수행 시간이 가장 빠른 경우 평균의 경우(average case): 수행시간이 평균적인 경우 최악의 경우(worst case): 수행 시간이 가장 늦은 경우 최악의 경우 최선의 경우 평균적인 경우 A B C D E F G 입력 집합 수행시간 100 50

최선, 평균, 최악의 경우 최선의 경우: 의미가 없는 경우가 많다. 평균적인 경우: 계산하기가 상당히 어려움. 최악의 경우: 가장 널리 사용된다. 계산하기 쉽고 응용에 따라서 중요한 의미를 가질 수도 있다. (예) 비행기 관제업무, 게임, 로보틱스

최선, 평균, 최악의 경우 (예) 순차탐색 최선의 경우: 찾고자 하는 숫자가 맨앞에 있는 경우 ∴ O(1) 최악의 경우: 찾고자 하는 숫자가 맨뒤에 있는 경우 ∴ O(n) 평균적인 경우: 각 요소들이 균일하게 탐색된다고 가정하면 (1+2+…+n)/n=(n+1)/2

연산을 호출할때 구조체를 함수의 파라미터로 전달 자료 구조의 C언어 표현방법 자료구조와 관련된 데이터들을 구조체로 정의 연산을 호출할 경우, 이 구조체를 함수의 파라미터로 전달 (예) // 자료구조 스택과 관련된 자료들을 정의 typedef int element; typedef struct { int top; element stack[MAX_STACK_SIZE]; } StackType; // 자료구조 스택과 관련된 연산들을 정의 void push(StackType *s, element item) { if( s->top >= (MAX_STACK_SIZE -1)){ stack_full(); return; } s->stack[++(s->top)] = item; 자료구조의 요소 관련된 데이터를 구조체로 정의 연산을 호출할때 구조체를 함수의 파라미터로 전달

자료구조 기술규칙 상수 변수의 이름 함수의 이름 대문자로 표기 (예) #define MAX_ELEMENT 100 소문자를 사용하였으며 언더라인을 사용하여 단어와 단어를 분리 (예) int increment;      int new_node; 함수의 이름 동사를 이용하여 함수가 하는 작업을 표기 (예) int add(ListNode *node)    // 혼동이 없는 경우 int list_add(ListNode *node) // 혼동이 생길 우려가 있는 경우              

자료구조 기술규칙 (예) typedef int element; typedef struct ListNode {              element data;              struct ListNode *link;       } ListNode;               typedef <새로운 타입의 정의>  <새로운 타입 이름>;