[sopt] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열,...

40
1010101010100000 0101010101010001 0101010100101010 1010101010100101 DATA STRUCTURES @Override public void add(Node<T> node) { Node pointer = header; while (pointer.next != null) { pointer = pointer.next; } pointer.next = node; size++; } 자료 구조 및 알고리즘 개요 · 기본 자료 구조 A B H G front rear

Upload: sopt-shout-our-passion-together

Post on 14-Jan-2017

1.184 views

Category:

Software


5 download

TRANSCRIPT

Page 1: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0

0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1

0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0

1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1

DATA STRUCTURES

@Override

public void add(Node<T> node) {

Node pointer = header;

while (pointer.next != null) {

pointer = pointer.next;}pointer.next = node;

size++;}

자료구조및알고리즘개요 · 기본자료구조

A

B

H

G

front

rear

Page 2: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

TABLE OF CONTENTS

SHOUT OUR PASSION TOGETHER DATA STRUCTURES INDEX

004

010

014

015

016

018

020

023

032

033

035

040

자료구조및 알고리즘의필요성

자료구조와 알고리즘의구분

스터디에서다룰 자료구조의 범위

객체지향 프로그래밍및 기타알아야할 사항

알고리즘의정의 및조건

알고리즘의증명

성능분석

점근적표기법

기본자료 구조 - 배열

기본자료 구조 - 연결 리스트

코드분석

확장

Page 3: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

자료구조및알고리즘개요개요 · 알고리즘의 정의및조건 · 증명 방식 · 성능분석 · 점근적 표기법

Page 4: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

Page 5: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

프로젝트는목적을 정의한명세들의 집합이므로각각의명세 및입력과 출력에대해명확하게 이해할수있어야 한다

Page 6: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

프로젝트에서요구하는 명세사항들을 실제로해결가능한작은문제로 나눠구조화한다 (cf. 상향식 vs 하향식)

Page 7: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

프로그램이필요로 하는

'데이터 객체 - 데이터 추상화'와'객체간 연산 - 알고리즘'의 관점에서

프로젝트를보고 설계한다

Page 8: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

데이터객체에 대한표현을 선택하고이와관련된 알고리즘을실제로 작성한다

Page 9: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조및알고리즘의필요성

요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거

일반적인시스템개발라이프사이클

수학적기법을 활용하는대신정확성이증명된 알고리즘을활용하여검증 후코드 수정

Page 10: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조와알고리즘의구분

자료구조 알고리즘

주어진일이어떤형태로표현될것인가 표현된일을어떤방식으로처리할것인가

Page 11: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조와알고리즘의구분

어떤자료구조를선택하느냐에따라알고리즘의효율성이달라진다

Page 12: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조와알고리즘의구분

http://sopt.org

Page 13: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요자료구조와알고리즘의구분

http://sopt.org

브라우저에서의뒤로가기 구현 – 어떤자료구조를 사용할것인가

Page 14: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요스터디에서다룰자료구조의범위

Array · Linked List Stack · Queue Tree Graph

ptr

header

cf. 알고리즘 : 정렬, 해시, 문자열패턴매칭

Page 15: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

개요객체지향프로그래밍및기타알아야할사항

상속 : 기존데이터형의기능을확장하는객체간관계를의미

캡슐화 : 외부로부터구현내용을감춰최소한의정보만을제공

추상화 : 복잡한시스템으로부터핵심적인개념을간추려내는것

제너릭 · 템플릿 :데이터형을매개변수화하여설계

Page 16: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘정의

al·go·rithmӕlgərɪðəm

noun

A process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer

translated

계산이나문제해결과정에서따라야하는프로세스나규칙을의미어떤작업을수행하기위해입력을받아원하는출력을만들어내는일련의과정

Page 17: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘조건

명확성 : 각명령은명확하고모호하지않아야한다

출력 : 적어도한가지이상의결과를생성한다

입력 : 외부에서제공되는데이터가 0개이상존재한다

유한성 : 알고리즘을수행하면일정단계뒤에는반드시종료된다

유효성 : 원칙적으로모든명령들은기본적인것이어야한다

Page 18: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

연쇄작용 · 재귀호출 · 수학적귀납법

Study - Data Structures

증명

Page 19: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘증명방식 - 귀납에의한증명

성격이같지만크기가다른문제간의관계를파악하는것이목표

Page 20: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘성능분석

Q. 성능분석이필요한이유

Page 21: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘성능분석

Q. 성능분석이필요한이유

A. 메모리및시간은제한적

Page 22: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘성능분석

Q. 성능분석이필요한이유

A. 메모리및시간은제한적

프로그램을수행하기 위해필요한 메모리및저장 공간에대한이슈

- 표현 : S(P) = c + S𝗉

- 고정 (c) : code, static 영역및 단순데이터. 입출력연산과상관없음- 가변 (S𝗉) : stack, heap 영역.입출력 특성과연관있는 경우가대부분

특정 문제의규모에의해 크기가결정되는요소가 차지하는공간

프로그램이실행되는데애 필요한시간에 대한이슈

- 표현 : T(P) = c + T𝗉- 고정 (c) :컴파일 시간- 가변 (T𝗉) : 실행시간 - 추산하는과정이필요

Page 23: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법

f(n) = Θ(g(n)) : 모든 n, n ≥ n₀에 대해 c₁·g(n) ≤ f(n) ≤ c₂·g(n)을 만족하는세양의상수 c₁, c₂, n₀가존재

→ 정의에의해 다음이성립 : f(n) = Θ(g(n)) ⇒ f(n) = O(g(n)) AND f(n) = Ω(g(n))

f(n) = Ω(g(n)) : 모든 n, n ≥ n₀에 대해 f(n) ≥ c·g(n)을만족하는두양의상수 c, n₀가존재

f(n) = O(g(n)) : 모든 n, n ≥ n₀에 대해 f(n) ≤ c·g(n)을만족하는두양의상수 c, n₀가존재

앞에서언급한성능이특정입력 n에 대해다음과같이추산될경우

Page 24: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -합병정렬

1

7

6

3

8

4

5

2

1

7

6

3

8

4

5

2

1

7

3

6

4

8

2

5

1

3

6

7

2

4

5

8

1

2

3

4

5

6

7

8

1

7

6

3

8

4

5

2

1

7

6

3

8

4

5

2

Page 25: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -합병정렬

𝑻 𝒏 ≤ 𝟐 · 𝑻𝒏𝟐 +𝒏

= 𝟐 · 𝟐 · 𝑻𝒏𝟒 +  

𝒏𝟐 + 𝒏 = 𝟒 · 𝑻

𝒏𝟒 +𝒏 +𝒏

= 𝟒 · 𝟐 · 𝑻𝒏𝟖 +  

𝒏𝟒 + 𝒏 +𝒏 = 𝟖 · 𝑻

𝒏𝟖 +𝒏 +𝒏 +𝒏

= 𝟐𝒌-𝟏 · 𝟐 · 𝑻𝒏𝟐𝒌 +  

𝒏𝟐𝒌-𝟏 + 𝒌 − 𝟏 · 𝒏 = 𝟐𝒌 · 𝑻

𝒏𝟐𝒌 + 𝒌 · 𝒏

= 𝟐𝒌 · 𝑻𝒏𝟐𝒌 + 𝒌 · 𝒏

= 𝒏 · 𝑻 𝟏 + 𝒏 · log𝟐 𝒏   ∵ 𝒏 =  𝟐𝒌 = 𝐎(𝐧 7 log𝟐𝒏)

Page 26: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -합병정렬 :추정후증명

𝑻 𝒏 ≤ 𝟐 · 𝑻 𝒏𝟐+ 𝒏에 대해서 𝐎 𝐧 7 log𝟐𝒏 를만족한다고가정하면 (경계조건제외)

𝑻 𝒏 ≤ 𝟐 · 𝑻𝒏𝟐 +𝒏

= 𝟐 7 𝒄 7𝒏𝟐 · log𝟐

𝒏𝟐 + 𝒏 = 𝒄 7 𝒏 7 log𝟐

𝒏𝟐 + 𝒏

= 𝒄 7 𝒏 7 log𝟐 𝒏− 𝟏 +𝒏 = 𝒄 · 𝒏 · log𝟐 𝒏 + 𝒄 − 𝟏 7 𝒏 =  𝐎 𝐧 7 log𝟐 𝒏

이므로 원래의 가정에 어긋나지 않는다.

Page 27: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -마스터정리 [근사형태]

𝒂 ≥ 𝟏,𝒃 ≥ 𝟏에대해 𝑻 𝒏 ≤ 𝒂 · 𝑻 𝒏𝒃+ 𝒇(𝒏)인점화식에서 𝒏?@A𝒃 𝒂 = 𝒉(𝒏)이라할 때,

𝑻 𝒏 의 점근적복잡도는 다음과같다.

lim𝒏→F

𝒇(𝒏)𝒉(𝒏) = ∞ 이고,충분히 큰모든 n에 대해 𝐚 7 𝒇 𝒏

𝒃 < 𝒇 𝒏 이면 𝑻 𝒏 = 𝜽(𝒇 𝒏 ) 이다

lim𝒏→F

𝒇(𝒏)𝒉(𝒏) = 𝟎 이면 𝑻 𝒏 = 𝜽(𝒉 𝒏 ) 이다

𝒇(𝒏)𝒉(𝒏) = 𝜽(𝟏)이면 𝑻 𝒏 = 𝜽(𝒉 𝒏 7 log 𝒏) 이다

Page 28: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -합병정렬 :마스터정리 [근사형태]

𝑻 𝒏 ≤ 𝟐 · 𝑻 𝒏𝟐+ 𝒏에 대해서 𝒂 = 𝟐,𝒃 = 𝟐  이므로, 𝒇 𝐧 = 𝒉 𝒏 = 𝒏  이다

이때,𝒇(𝒏)𝒉(𝒏)

= 𝒏𝒏= 𝟏 = 𝜽(𝟏) 이므로 𝑻 𝒏 = 𝜽(𝒏 7 log 𝒏) 이다

Page 29: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -피보나치수열

Page 30: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

알고리즘점근적표기법 -피보나치수열

피보나치수열코드분석 · 점화식 · 일반항 · 점근적복잡도 계산

Page 31: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

기본자료구조배열 · 연결 리스트 · 코드분석 · 확장

Page 32: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

기본자료구조배열 : Array

ptr

Page 33: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

기본자료구조연결리스트 : Linked List

header

Page 34: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

Study - Data Structures

기본자료구조배열과연결리스트의차이점

배열 연결리스트

Array Linked List

크기가크면 일시적으로할당 불가능한경우발생 O

할당시점에 고정된크기의 연속된메모리를할당

물리적구조와 연관된데이터 컬렉션

확장 : 복사나 기존메모리해제 등부가작업 필요

특정요소를 찾으려면일일히 검색하는것이필요

→ 캐시등 특별한값에 대해서별도의 공간에보관하는 방법추가 가능

연결이논리적으로 구성되어확장이 자유로움

논리적연결로 구성된데이터 컬렉션

확장 : 다음 노드에연결 - 간단히구현가능

인덱스를사용하면 빠르게접근 가능

Page 35: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

코드분석연결리스트 -명세

Study - Data Structures

public class LinkedList<T> extends Collection<T> {

private Node<T> header = new Node<T>();

public void add(Node<T> node) { … }public void insert(int index, Node<T> node) { … }public int indexOf(Node<T> node) { … }public Node<T> remove(int index) { … }

@Overridepublic Node<T> get(int index) { … }

}

public abstract class Collection<T> {

protected int size;public int size() { return size; }

public abstract Node<T> get(int index);}

public class Node<T> {

public Node next;public T t;

public Node() {}public Node(T t) {

this.t = t;}

}

연결리스트의 시작점을정의

요소추가 및삽입, 위치반환, 삭제동작 정의

Node<T> Collection<T>.get(int index) 재정의

데이터컬렉션에 대한정의

크기및 특정위치의 요소반환에대한 명세

컬렉션을구성하는 각요소에 대한정의

실질적인내용을 템플릿으로매개변수화

Page 36: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

코드분석연결리스트 -요소추가,특정위치의요소반환

Study - Data Structures

public class LinkedList<T> extends Collection<T> {

public void add(Node<T> node) {

Node pointer = header;

while (pointer.next != null) pointer = pointer.next;

pointer.next = node;size++;

}

@Overridepublic Node<T> get(int index) {

if (index < 0 || index >= size)throw new IndexOutOfBoundsException();

int count = 0;Node pointer = header.next;

while (count++ < index) pointer = pointer.next;

return pointer;}

…}

포인터의다음 요소가 null일때까지 이동

마지막까지이동한 후, 요소를연결하고크기 증가

header.next에 포인터를 지정 : null 검사불필요

index가 범위를 벗어날경우에 대한예외처리

지정한만큼이동하고 포인터가가리키는 주소를반환

Page 37: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

코드분석연결리스트 -요소삽입

Study - Data Structures

public class LinkedList<T> extends Collection<T> {

public void insert(int index, Node<T> node) {

if (index < 0 || index >= size)throw new IndexOutOfBoundsException();

int count = 0;Node pointer = header;

while (pointer.next != null) {

if (count++ == index)break;

pointer = pointer.next;}

node.next = pointer.next;pointer.next = node;

size++;}

…}

지정한 index에 주어진요소를 밀어넣는작업

신규요소를 node, 기존 요소를 pointer라 하면pointer -> node.next -> pointer.next 순으로연결

pointer

pointer.next

node node.next

포인터가지정된 횟수만큼이동하고 요소를삽입

신규요소의 next를 할당하는작업 필요

Page 38: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

코드분석연결리스트 -특정요소의위치반환

Study - Data Structures

public class LinkedList<T> extends Collection<T> {

public int indexOf(Node<T> node) {

int index = 0;Node pointer = header;

while (pointer.next != null) {

pointer = pointer.next;

if (pointer.equals(node)) return index;

index++;}

return -1;}

…}

선형검색으로 특정요소가 있는지에대해확인

마지막까지이동해도 검색에실패하면 -1리턴

Page 39: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

코드분석연결리스트 -요소삭제

Study - Data Structures

public class LinkedList<T> extends Collection<T> {

public Node<T> remove(int index) {

if (index < 0 || index >= size)throw new IndexOutOfBoundsException();

int count = 0;Node pointer = header;

while (count++ < index) pointer = pointer.next;

Node temp = pointer.next;pointer.next = pointer.next.next;

size--;return temp;

}

…}

지정한 index의 요소를삭제하는 작업

index가 범위를 벗어날경우에 대한예외처리

포인터가지정된 횟수만큼이동하고 요소를삭제

삭제할요소를 temp라는 변수로잡고전후의 요소를연결하는과정으로 이해하는것이 편함

pointer pointer.next.next

node

pointer.next

Page 40: [SOPT] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열, 연결리스트

확장연결리스트의응용

Study - Data Structures

이중 연결 리스트

희소 행렬

가용 공간 리스트

순환 큐스택 · 큐

후위식 연산

다음 요소뿐만아니라이전요소에대한연결도관리하는형태의연결리스트

연결 리스트

임의의크기를가진행렬에대해, 유효한항의갯수가행렬전체크기에비해엄청적은행렬

임의의행렬에대해,유효한항의갯수가행렬전체크기에비해매우적은행렬

배열로구현된큐의연산과정에서발생하는문제점을보완한큐

중위식연산을스택을사용하여후위식으로변환하고이를연산하는과정