[sopt] 데이터 구조 및 알고리즘 스터디 - #01 : 개요, 점근적 복잡도, 배열,...
TRANSCRIPT
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
TABLE OF CONTENTS
SHOUT OUR PASSION TOGETHER DATA STRUCTURES INDEX
004
010
014
015
016
018
020
023
032
033
035
040
자료구조및 알고리즘의필요성
자료구조와 알고리즘의구분
스터디에서다룰 자료구조의 범위
객체지향 프로그래밍및 기타알아야할 사항
알고리즘의정의 및조건
알고리즘의증명
성능분석
점근적표기법
기본자료 구조 - 배열
기본자료 구조 - 연결 리스트
코드분석
확장
자료구조및알고리즘개요개요 · 알고리즘의 정의및조건 · 증명 방식 · 성능분석 · 점근적 표기법
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
프로젝트는목적을 정의한명세들의 집합이므로각각의명세 및입력과 출력에대해명확하게 이해할수있어야 한다
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
프로젝트에서요구하는 명세사항들을 실제로해결가능한작은문제로 나눠구조화한다 (cf. 상향식 vs 하향식)
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
프로그램이필요로 하는
'데이터 객체 - 데이터 추상화'와'객체간 연산 - 알고리즘'의 관점에서
프로젝트를보고 설계한다
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
데이터객체에 대한표현을 선택하고이와관련된 알고리즘을실제로 작성한다
Study - Data Structures
개요자료구조및알고리즘의필요성
요구사항수집 문제분석 설계 정제및 프로그래밍 검증및 오류제거
일반적인시스템개발라이프사이클
수학적기법을 활용하는대신정확성이증명된 알고리즘을활용하여검증 후코드 수정
Study - Data Structures
개요자료구조와알고리즘의구분
자료구조 알고리즘
주어진일이어떤형태로표현될것인가 표현된일을어떤방식으로처리할것인가
Study - Data Structures
개요자료구조와알고리즘의구분
어떤자료구조를선택하느냐에따라알고리즘의효율성이달라진다
Study - Data Structures
개요자료구조와알고리즘의구분
http://sopt.org
Study - Data Structures
개요자료구조와알고리즘의구분
http://sopt.org
브라우저에서의뒤로가기 구현 – 어떤자료구조를 사용할것인가
Study - Data Structures
개요스터디에서다룰자료구조의범위
Array · Linked List Stack · Queue Tree Graph
ptr
header
cf. 알고리즘 : 정렬, 해시, 문자열패턴매칭
Study - Data Structures
개요객체지향프로그래밍및기타알아야할사항
상속 : 기존데이터형의기능을확장하는객체간관계를의미
캡슐화 : 외부로부터구현내용을감춰최소한의정보만을제공
추상화 : 복잡한시스템으로부터핵심적인개념을간추려내는것
제너릭 · 템플릿 :데이터형을매개변수화하여설계
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
계산이나문제해결과정에서따라야하는프로세스나규칙을의미어떤작업을수행하기위해입력을받아원하는출력을만들어내는일련의과정
Study - Data Structures
알고리즘조건
명확성 : 각명령은명확하고모호하지않아야한다
출력 : 적어도한가지이상의결과를생성한다
입력 : 외부에서제공되는데이터가 0개이상존재한다
유한성 : 알고리즘을수행하면일정단계뒤에는반드시종료된다
유효성 : 원칙적으로모든명령들은기본적인것이어야한다
연쇄작용 · 재귀호출 · 수학적귀납법
Study - Data Structures
증명
Study - Data Structures
알고리즘증명방식 - 귀납에의한증명
성격이같지만크기가다른문제간의관계를파악하는것이목표
Study - Data Structures
알고리즘성능분석
Q. 성능분석이필요한이유
Study - Data Structures
알고리즘성능분석
Q. 성능분석이필요한이유
A. 메모리및시간은제한적
Study - Data Structures
알고리즘성능분석
Q. 성능분석이필요한이유
A. 메모리및시간은제한적
프로그램을수행하기 위해필요한 메모리및저장 공간에대한이슈
- 표현 : S(P) = c + S𝗉
- 고정 (c) : code, static 영역및 단순데이터. 입출력연산과상관없음- 가변 (S𝗉) : stack, heap 영역.입출력 특성과연관있는 경우가대부분
특정 문제의규모에의해 크기가결정되는요소가 차지하는공간
프로그램이실행되는데애 필요한시간에 대한이슈
- 표현 : T(P) = c + T𝗉- 고정 (c) :컴파일 시간- 가변 (T𝗉) : 실행시간 - 추산하는과정이필요
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에 대해다음과같이추산될경우
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
Study - Data Structures
알고리즘점근적표기법 -합병정렬
𝑻 𝒏 ≤ 𝟐 · 𝑻𝒏𝟐 +𝒏
= 𝟐 · 𝟐 · 𝑻𝒏𝟒 +
𝒏𝟐 + 𝒏 = 𝟒 · 𝑻
𝒏𝟒 +𝒏 +𝒏
= 𝟒 · 𝟐 · 𝑻𝒏𝟖 +
𝒏𝟒 + 𝒏 +𝒏 = 𝟖 · 𝑻
𝒏𝟖 +𝒏 +𝒏 +𝒏
…
= 𝟐𝒌-𝟏 · 𝟐 · 𝑻𝒏𝟐𝒌 +
𝒏𝟐𝒌-𝟏 + 𝒌 − 𝟏 · 𝒏 = 𝟐𝒌 · 𝑻
𝒏𝟐𝒌 + 𝒌 · 𝒏
= 𝟐𝒌 · 𝑻𝒏𝟐𝒌 + 𝒌 · 𝒏
= 𝒏 · 𝑻 𝟏 + 𝒏 · log𝟐 𝒏 ∵ 𝒏 = 𝟐𝒌 = 𝐎(𝐧 7 log𝟐𝒏)
Study - Data Structures
알고리즘점근적표기법 -합병정렬 :추정후증명
𝑻 𝒏 ≤ 𝟐 · 𝑻 𝒏𝟐+ 𝒏에 대해서 𝐎 𝐧 7 log𝟐𝒏 를만족한다고가정하면 (경계조건제외)
𝑻 𝒏 ≤ 𝟐 · 𝑻𝒏𝟐 +𝒏
= 𝟐 7 𝒄 7𝒏𝟐 · log𝟐
𝒏𝟐 + 𝒏 = 𝒄 7 𝒏 7 log𝟐
𝒏𝟐 + 𝒏
= 𝒄 7 𝒏 7 log𝟐 𝒏− 𝟏 +𝒏 = 𝒄 · 𝒏 · log𝟐 𝒏 + 𝒄 − 𝟏 7 𝒏 = 𝐎 𝐧 7 log𝟐 𝒏
이므로 원래의 가정에 어긋나지 않는다.
Study - Data Structures
알고리즘점근적표기법 -마스터정리 [근사형태]
𝒂 ≥ 𝟏,𝒃 ≥ 𝟏에대해 𝑻 𝒏 ≤ 𝒂 · 𝑻 𝒏𝒃+ 𝒇(𝒏)인점화식에서 𝒏?@A𝒃 𝒂 = 𝒉(𝒏)이라할 때,
𝑻 𝒏 의 점근적복잡도는 다음과같다.
lim𝒏→F
𝒇(𝒏)𝒉(𝒏) = ∞ 이고,충분히 큰모든 n에 대해 𝐚 7 𝒇 𝒏
𝒃 < 𝒇 𝒏 이면 𝑻 𝒏 = 𝜽(𝒇 𝒏 ) 이다
lim𝒏→F
𝒇(𝒏)𝒉(𝒏) = 𝟎 이면 𝑻 𝒏 = 𝜽(𝒉 𝒏 ) 이다
𝒇(𝒏)𝒉(𝒏) = 𝜽(𝟏)이면 𝑻 𝒏 = 𝜽(𝒉 𝒏 7 log 𝒏) 이다
Study - Data Structures
알고리즘점근적표기법 -합병정렬 :마스터정리 [근사형태]
𝑻 𝒏 ≤ 𝟐 · 𝑻 𝒏𝟐+ 𝒏에 대해서 𝒂 = 𝟐,𝒃 = 𝟐 이므로, 𝒇 𝐧 = 𝒉 𝒏 = 𝒏 이다
이때,𝒇(𝒏)𝒉(𝒏)
= 𝒏𝒏= 𝟏 = 𝜽(𝟏) 이므로 𝑻 𝒏 = 𝜽(𝒏 7 log 𝒏) 이다
Study - Data Structures
알고리즘점근적표기법 -피보나치수열
Study - Data Structures
알고리즘점근적표기법 -피보나치수열
피보나치수열코드분석 · 점화식 · 일반항 · 점근적복잡도 계산
기본자료구조배열 · 연결 리스트 · 코드분석 · 확장
Study - Data Structures
기본자료구조배열 : Array
ptr
Study - Data Structures
기본자료구조연결리스트 : Linked List
header
Study - Data Structures
기본자료구조배열과연결리스트의차이점
배열 연결리스트
Array Linked List
크기가크면 일시적으로할당 불가능한경우발생 O
할당시점에 고정된크기의 연속된메모리를할당
물리적구조와 연관된데이터 컬렉션
확장 : 복사나 기존메모리해제 등부가작업 필요
특정요소를 찾으려면일일히 검색하는것이필요
→ 캐시등 특별한값에 대해서별도의 공간에보관하는 방법추가 가능
연결이논리적으로 구성되어확장이 자유로움
논리적연결로 구성된데이터 컬렉션
확장 : 다음 노드에연결 - 간단히구현가능
인덱스를사용하면 빠르게접근 가능
코드분석연결리스트 -명세
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) 재정의
데이터컬렉션에 대한정의
크기및 특정위치의 요소반환에대한 명세
컬렉션을구성하는 각요소에 대한정의
실질적인내용을 템플릿으로매개변수화
코드분석연결리스트 -요소추가,특정위치의요소반환
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가 범위를 벗어날경우에 대한예외처리
지정한만큼이동하고 포인터가가리키는 주소를반환
코드분석연결리스트 -요소삽입
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를 할당하는작업 필요
코드분석연결리스트 -특정요소의위치반환
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리턴
코드분석연결리스트 -요소삭제
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
확장연결리스트의응용
Study - Data Structures
이중 연결 리스트
희소 행렬
가용 공간 리스트
순환 큐스택 · 큐
후위식 연산
다음 요소뿐만아니라이전요소에대한연결도관리하는형태의연결리스트
연결 리스트
임의의크기를가진행렬에대해, 유효한항의갯수가행렬전체크기에비해엄청적은행렬
임의의행렬에대해,유효한항의갯수가행렬전체크기에비해매우적은행렬
배열로구현된큐의연산과정에서발생하는문제점을보완한큐
중위식연산을스택을사용하여후위식으로변환하고이를연산하는과정