컴퓨터알고리즘#5
LeeMir, 17 March 2021
기본 추상자료형
추상자료형
- 추상자료형(Abstract Data Type, ADT) : 데이터구조의 추상형
- ADT는 다음을 명세함
- 저장된 데이터
- 데이터에 대한 작업들
- 작업 중 발생 가능한 에러 상황들
리스트 ADT
- 연속적인 임의 개체들을 모델링
- 원소들의 순서(ordered) 집단을 저장하기 위한 기초적이고, 일반적 목적의 데이터 구조
- 원소(Element)에 대한 접근 도구
- 순위(rank)
- 응용
- 스택, 큐, 집합 등의 더 복잡한 데이터구조를 구축하기 위한 재료로 사용
- 소규모 데이터베이스(ex : 주소록)
- 일반 메쏘드
integer size()
boolean isEmpty()
iterator elements()
- 접근 메쏘드
element get(r)
- 갱신 메쏘드
element set(r, e)
add(r, e), addFirst(e), addLast(e)
element remove(r), element removeFirst(), element removeLast()
- 예외
invalidRankException()
fullListException()
emptyListException()
- 배열을 이용한 구현
- 삽입 / 삭제할 때마다 shift 연산을 해야해 자유롭지 않음 => O(n)
- 첫번째 인덱스에 삽입/삭제 : O(n)
- 마지막 인덱스에 삽입/삭제 : O(1)
- 탐색은 빠른 편 => O(1)
- 삽입 / 삭제할 때마다 shift 연산을 해야해 자유롭지 않음 => O(n)
- 단일 연결 리스트를 이용한 구현
- Head Pointer와 NodeList 구조체를 만들어 구현
집합 ADT
- 유일한 개체들을 담는 용기를 모델링
- 중복이 없으며, 순서가 존재하지 않음
- 집합 ADT 관련 작업들의 효율적인 구현을 위해, 집합을 집합 원소들의 정렬된 리스트로 표현
- 주요 메쏘드
set union(B)
: 집합 B와의 합집합 반환set intersect(B)
: 교집합 반환set subtract(B)
: 차집합 반환
- 응용
- 키워드 검색엔진
- 집합론에 관련된 다양한 계산
- 알고리즘을 위한 보조 데이터구조
- 다른 데이터구조를 구성하는 요소
스택 ADT
- 임의의 개체를 저장
- 삽입과 삭제는 후입선출(Last-In First-Out, LIFO) 순서를 따름
- 삽입과 삭제는 스택의 top이라 불리는 위치에서 수행
- 가장 최근에 했던 작업의 취소(Ctrl+Z)에 쓰임
- 주요 메쏘드
push(e)
: 원소를 삽입element pop()
: 가장 최근에 삽입된 원소를 삭제 및 반환
- 응용
- 웹브라우저에서 방문한 웹페이지들의 기록
- 문서편집기에서 되돌리기 기록
- 윈도 운영체제에서 겹쳐진 윈도우들
- C++ 실행환경 또는 자바가상기계에서 메쏘드의 연쇄적인 호출
- 재귀의 구현
- 알고리즘 수행을 위한 보조 데이터구조
- 다른 데이터구조를 구성하는 요소
큐 ADT
- 임의의 개체를 저장
- 삽입과 삭제는 선입선출(First-In First-Out, FIFO) 순서를 따름
- 삽입은 큐의 뒤(rear), 삭제는 큐의 앞(front)이라 불리는 위치에서 수행
- 주요 메쏘드
enqueue(e)
: 큐의 뒤에 원소를 삽입element dequeue()
: 큐의 앞에서 원소를 삭제하고 반환
- 응용
- 대기열
- 공유자원에 대한 접근(프린터)
- 멀티프로그래밍
- 알고리즘 수행을 위한 보조 데이터구조
- 다른 데이터구조를 구성하는 요소
- 배열로 구현할 경우, 선형으로 사용하면 비효율적이므로 원형으로 사용해야함
- 빈 큐를 만원 큐와 구분하기 위해
- 한 개의 빈 방을 예비로 둠
- 대안 : 원소 개수를 유지
- 빈 큐를 만원 큐와 구분하기 위해
트리 ADT
- 계층적으로 저장된 데이터원소들을 모델링
- 맨위의 원소를 제외하고, 각 트리 원소는 부모 원소와 0개 이상의 자식 원소들을 가짐
- 전제 : 트리는 비어 있지 않음(알고리즘 단순화)
- 용어
- 루트 : 부모가 없는 노드
- 내부노드 : 적어도 한 개의 자식을 가진 노드
- 외부노드(또는 리프) : 자식이 없는 노드
- 형제 : 같은 부모를 가진 노드들
- 노드의 조상 : 부모, 증부모, 증조부모 등
- 노드의 자손 : 자식, 손주, 증손주 등
- 부트리(서브 트리) : 노드와 노드의 자손들로 구성된 트리
- 경로 : 조상 또는 자손을 따라 이어진 노드 시퀀스
- 경로길이 : 경로 내 간선(Edge)의 수
- 노드의 깊이 : 루트로부터 노드에 이르는 유일한 경로의 길이
- 노드의 높이 : 노드로부터 외부노드에 이르는 가장 긴 경로의 길이
- 트리의 높이 : 루트의 높이
- 순서트리
- 각 노드의 자식들에 대해 선형 순서가 정의되어 있는 트리
- 이진트리
- 순서트리를 모델링
- 전제 : 적정이진트리로 구현, 이진트리는 비어있지 않음
- 트리의 각 내부노드가 두 개의 자식을 가짐
- (재귀적 정의) 루트가 자식의 순서쌍을 가지며, 내부노드인 자식은 이진트리
- 응용
- 조직구성도
- 파일시스템
- 프로그래밍 환경
- 알고리즘을 위한 보조 데이터구조
- 다른 데이터구조를 구성하는 요소
- 순회
- 선위(전위)순회, preorder
- VLR
- 중위순회, inorder
- LVR
- 후위순회, postorder
- LRV
- 선위(전위)순회, preorder