240 likes | 773 Views
1 장 . 자료구조의 개요 1 절 . 자료구조와 알고리즘 2 절 . 추상데이터 타입 3 절 . 성능 분석. 이 완 직 ( wjlee@pnu.ac.kr ) 2010 년 1 학기. 학습 목표. 자료구조와 알고리즘의 개념을 이해한다 . 알고리즘의 표현 방법을 알아본다 . 데이터의 추상화의 필요성을 이해한다 . 알고리즘의 선택 기준과 성능 분석 방법을 알아본다. 1. 자료구조와 알고리즘. 자료구조 데이터를 프로그램 상에서 표현하는 방법
E N D
1장. 자료구조의 개요1절. 자료구조와 알고리즘 2절. 추상데이터 타입 3절. 성능 분석 이 완 직 (wjlee@pnu.ac.kr) 2010년 1학기
학습 목표 • 자료구조와 알고리즘의 개념을 이해한다. • 알고리즘의 표현 방법을 알아본다. • 데이터의 추상화의 필요성을 이해한다. • 알고리즘의 선택 기준과 성능 분석 방법을 알아본다.
1. 자료구조와 알고리즘 • 자료구조 • 데이터를 프로그램 상에서 표현하는 방법 • 데이터의 특성에 따라서 분류하여 구성하고 저장 및 처리하는 모든 작업을 포함 • 자료구조의 구분
1. 자료구조와 알고리즘 • 알고리즘 • 문제를 풀기 위한 절차 • 특정 작업을 수행하기 위한 명령어들의 집합 • 알고리즘이 되기 위한 5 가지 조건
1. 자료구조와 알고리즘 • 알고리즘 기술 방법 • 1) 자연어(국어, 영어) • 알고리즘 조건 중, 명확성을 만족하기 힘듦 • 2) 흐름도(flowchart) • 가장 명확하고판독하기 좋지만, 복잡한 알고리즘 표현이 어렵다. • 3) 유사코드(pseudo-code) • 4) C와 같은 프로그래밍 언어 • 교재에서는 C언어와 자연어를 혼용해서 사용
1. 자료구조와 알고리즘 • [예제 1-1] 절대값: 주어진 정수에 대한 절대값 구하기 • 1) 자연어 정수 값을 a에 저장한다. a에 저장된 값이 0보다 작을 경우에만 a에 -부호를 붙인 후에 a에 저장한다. • 2) 흐름도
1. 자료구조와 알고리즘 • [예제 1-1] 절대값 • 3) 의사 코드 a ← -5; if a < 0 then a ← -a; print a; • 4) C 언어 int abs(int a) { if (a < 0) //a가 0보다 작으면 a=-a; //부호를 변경한다. return a; }
2. 추상 데이터 타입 • 데이터 추상화(data abstraction) • 데이터의 명세(specification)와 구현(implementation)을 구분 • 정의: 데이터 타입(data type) • 데이터의 집합과 이러한 데이터에 적용할 수 있는 연산(operation)의 집합 • Ex) int 데이터 타입 • 데이터: {0,+1, -1, +2, -2, …, MAXINT, MININT} • 연산: {+, -, *, /} • 참고) MAXINT, MININT는 특정 기계에서 int 타입으로 표현할수 있는 가장 큰 수와 작은 수이다. • 정의: 추상 데이터 타입(abstract data type; ADT) • 데이터의 명세와 이들 데이터에 대한 연산의 명세가 데이터의 표현과 연산의 구현으로부터 분리된 방식으로 구성된 데이터 타입
2. 추상 데이터 타입 • 추상화 개념 • DVD 플레이어: 사용자는 DVD 플레이어의 동작 방식만 알면 되고, 내부 구현에 대해서는 신경 쓸 필요가 없다. • 추상화: 명세와 구현을 불리 • 명세: 데이터 타입을 수학적으로 정의 • 데이터와 연산이 무엇(what)인가를 정의, 어떻게(how) 구현할것인지는 정의하지 않음 • 소프트웨어 개발의 중요한 개념 • 시스템 개발에 필요한 인력과 시간을 절감 • 대규모 팀 프로젝트 개발에 유용
2. 추상 데이터 타입 ADT 1.1 : 자연수(NaturalNumber) 추상 데이터 타입 ADT NaturalNumber is 객체: 정수의 순서가 있는 부분 범위로서, 0부터 해당 컴퓨터의 최대 정수(MAXINT) 까지 값을 갖음 함수: 모든 x, y ∈ NaturalNumber, TRUE, FALSE ∈ Boolean이고 +, -, <, ==, = 는 일반적인 정수 연산에 대해 Zero():NaturalNumber ::= 0 IsZero(x):Boolean ::= if (x == 0) IsZero = TRUE else IsZero = FALSE Add(x,y):NaturalNumber ::= if (x+y <= MAXINT) Add = x+y else Add = MAXINT Equal(x,y):Boolean ::= if (x == y) Equal = TRUE else Equal = FALSE Successor(x):NaturalNumber ::= if (x == MAXINT) Successor = x else Successor = x+1 Subtract(x,y):NaturalNumber ::= if (x<y) Subtract = 0 else Subtract = x-y end NaturalNumber
3. 성능 분석 • 동일한 문제를 해결하기 위해 여러 가지 알고리즘이 존재할 수 있음 • 가장 효율적인 알고리즘은? • 3.1 성능 평가 • 프로그램의 성능 평가(performance evaluation)를 하기 위한 알고리즘의 효율성 • 공간적 효율성과 시간적 효율성이라는 범주에서 고려 • 정의: 프로그램의 공간 복잡도(space complexity) • 프로그램을 실행시켜 완료하는 데 필요한 공간의 양 • 정의: 프로그램의 시간 복잡도(time complexity) • 프로그램을 실행시켜 완료하는데 필요한 컴퓨터 시간의 양
3. 성능 분석 • 3.1.1 공간 복잡도 • 공간 복잡도 = 고정공간 + 가변공간 • 고정공간 • 프로그램 입출력 개수와 횟수와 상관없이 고정적인 저장공간 • 명령어 공간(프로그램 코드), 단순 변수, 상수들을 위한 공간 • 가변공간 • 실행과정의 자료와 변수의 저장공간과 함수 호출/리턴에 관련된 정보를 저장하는 공간
3. 성능 분석 • 3.1.2 시간 복잡도 • 시간 복잡도 = 컴파일 시간 + 실행 시간 • 컴파일 시간: 고정적인 시간, 시간 복잡도에 큰 영향을 미치지 못함 • 실행 시간이 가장 중요한 요소 • 실행 시간 • H/W 환경(CPU 성능, 가속장치 유무, 입출력장치 성능 등)과 S/W 환경(프로그램 언어, 운영체제, 컴파일러 등)에 따라 달라짐 • 실행 환경과 무관한 개략적인 분석 방법을 사용 • 입력 데이터 수 n에 대한 시간 함수 t(n)로 표현 • 할당, 비교, 계산, 입/출력 등의 연산 한번에 소요되는 시간을 모두 1로 가정 • 이러한 연산의 수행 횟수는 입력 데이터 개수 n에 따라 달라짐 • Ex) t(n) = 3n+2
3. 성능 분석 • 실행시간(연산 수행횟수) 예 알고리즘 A: ta(n) = n2알고리즘 B: tb(n) = 2n+1
3. 성능 분석 • 프로그램 단계(step) 수 측정: 연산의 총 횟수를 정확히 계산 • 주석/선언문: 0 step • 산술식 및 지정문: 1 step • a = b; // 1 a = b + c; // 2 • 반복문: 반복에 연결된 문장은 반복마다 그 문장의 step수 추가 • while <expr>: 매 반복시 마다 expr step 추가 • do … while <expr> : 매 반복시 마다 expr step 추가 • for(<init-stmt>; <expr1>; <expr2>) : • 첫 번째 반복에는 <init-stmt> + <expr1> step 추가 • 두 번째 반복부터는 <expr1> + <expr2> step 추가 • if(<expr>), switch(<expr>): expr step 추가 • 분기 명령문(continue, break, goto, return): 1 step • 함수 호출: 1 step, 함수명령문: 0 step
3. 성능 분석 • [예제 1-2] 나눗셈 예제 int div1(const int n) { return n/3; } int div2(const int n) { int q = 0; while(n>=3) { n=n-3; q=q+1; } return n; } tdiv1(n) = ? tdiv2(n) = ?
3. 성능 분석 • 3.2 점근 표기법(O, Ω, Θ) • 입력 개수가 많은 경우에는 차수가 가장 큰 항이 영향을 가장 크게 미치고 다른 항들은 상대적으로 무시될 수 있다.
3. 성능 분석 • 3.3 빅오(Big “Oh”) 표기법(O) • 빅오 표기법은 O 기호를 사용 알고리즘의 시간적인 효율을 분석, 입력데이터가 최악일 때 알고리즘이 보이는 효율을 기준 • Worst case를 기준으로 “최악의 데이터라도 길어야 이정도 시간이 걸린다”는 의미 수학적 정의 [빅오(Big "oh")] : 모든 n, n≥n0,에 대해 f(n) ≤ cg(n)인 조건을 만족하는 두 양의 상수 c와 n0가 존재하기만 하면 f(n) = Ο(g(n))(f of n은 "big-oh" of g of n이라 읽음)이다. f(n) = 3n + 2 cg(n) = 4n
3. 성능 분석 • [예제 1-3] • f(n) = 3n+2 는 O(n) 증명 • f(n) = 100n+6 은 O(n) 증명 • f(n) = 10n2+4n+2 는 O(n2) 증명 • f(n) = 3n+2 는 O(n2) 증명 • 위의 예와 같이 3n+2는 O(n), O(n2)를 모두 만족 • O() 표기는 최악의 경우를 가정한 점근 표기법 • “길어야 n시간이면 된다.”는 당연히 “길어야 n2시간이면 된다”를 만족 • 하지만 일반적인 경우, 가장 작은 상한 범위(Upper Bound)가 의미 있으므로 최소 O() 표현을 사용
3. 성능 분석 • 빅오 표기법에 따른 점근적인 실행시간 비교
3. 성능 분석 • 3.3 빅오메가(Ω) 표기법 • 빅오메가(Big Omega, Ω) 표기법은 빅오 기호의 반대 개념이다. 알고리즘 수행 시간의 하한(Lower Bound)으로서 “최소한 이만한 시간은 걸린다”라는 의미이다. 수학적 정의 [오메가(Omega)] : 모든 n, n≥n0,에 대해 f(n) ≥ cg(n)을 만족하는 두 양의 상수 c와 n0가 존재하기만 하면 f(n) = Ω(g(n)) (f of n은 "omega" of g of n이라 읽음)이다. 3n + 2 = Ω(n)
3. 성능 분석 • [예제 1-4] • 100n+6 = Ω(n) 증명 • 10n2+4n+2 = Ω(n2) 증명 • 6*2n+n2 = Ω(2n) 증명 • 빅오와 동일하게 오메가 표기법도 여러 g(n) 함수를 가지게 된다. • 5n2+3n = Ω(n2), Ω(n),Ω(1)을 모두 만족 • Ω 표기법은 수행 시간의 하한(적어도 이만한 시간 이상 걸린다)이므로 가장 큰 Ω 표기법이 의미 있는 값이다.
3. 성능 분석 • 3.4 빅세타(Θ) 표기법 • Ω(N)인 문제에 O(N)인 알고리즘이 존재할 경우 빅세타라고 한다. 수학적 정의 [세타(Theta)] : 모든 n, n≥n0,에 대해 C1g(n) ≤ f(n) ≤ C2g(n)을 만족하는 세 양의 상수 C1, C2와 n0가 존재하기만 하면 f(n) = Θ(g(n)) (f of n은 "theta" of g of n이라 읽음)이다. 3n + 2 = Θ(n)
3. 성능 분석 • [예제 1-5] • 3n+2 = Θ(n) 증명 • n >= 2 일때, 3n <= 3n+2 <= 4n 을 만족하므로 3n+2 = Θ(n)을 만족한다. • 10n2+4n+2 = Θ(n2) 증명 • 6*2n+n2 = Θ(2n) 증명 • 빅세타 표기법은 상한과 하한을 모두 만족하므로 빅오나 빅오메가 표기법보다 가장 정확한 실행시간 측정 방법이다.