자료구조
자료 구조의 개념
자료 구조의 정의
- 자료의 표현과 그것과 고나련된 연산
- 일련의 자료들을 조직하고 구조화
- 어떠한 자료 구조에서도 필요한 모든 연산들을 처리하는 것이 가능
- 자료 구조에 따라 프로그램 실행시간이 달라진다.
자료 구조의 이용
- 정렬 : 기억 장치 내의 자료를 일정한 순서에 의해 나열하는 것
- 검색 : 기억장치 내의 자료를 찾는 것
- 파일 편성 : 자료를 기억 매체에 저장할 때의 파일 구조
- 인덱스 : 파일에서 특정 자료를 빠르게 찾기 위한 색인표
Stack
스택의 개념
LIFO = 후입 선출 방식
TOP
- STACK으로 할당된 기억 공간에 가장 마지막으로 삽입된 자료가 기억된 위치를 가리키는 요소
- STACK 포인터라고 하기도 함
BOTTOM
- 스택의 가장 밑바닥
스택의 응용 분야
- 부 프로그램 호출 시 복귀주소를 저장할 때
- 함수 호출의 순서 제어
- 인터럽트가 발생하여 복귀주소를 저장할 때
- 후위 표기법으로 표현된 수식을 연산 할 때
- 0 주소 지정방식 명령어의 자료 저장소
- 재귀 프로그램의 순서 제어
- 컴파일러를 이용한 언어 번역 시
QUE 와 DEQUE
QUE
선형 리스트의 한쪽에서는 삽입, 다른 한쪽에는 삭제 작업이 이루어지도록 구성한 자료구조
FIFO 방식
시작과 끝을 표시하는 두 개의 포인터가 있다.
Front 포인터
- 가장 먼저 삽입 되는 자료의 기억 공간을 가리킴
- 삭제 잡업을 할 때 사용
REAR 포인터
- 가장 마지막에 삽입된 자료의 기억 장소를 가리키는 포인터
- 삽입 작업을 할 때 사용
큐 응용
- 대기 행렬 처리
- 운영체제의 작업 스케줄링
DEQUE
삽입과 삭제가 리스트의 양쪽 끝에서 모두 발생할 수 있는 자료 구조
stack과 queue의 장점만 따서 구성한것이다.
입력 제한 데크 : scroll
출력 제한 데크 : shelf
트리(tree)
트리의 정의
- 트리는 정점(node)와 선분(branch)를 이용하여 사이클을 이루지 않도록 구성한 graph의 특수한 형태이다
트리 관련 용어
- node : 트리의 기본 요소로서 자료 항목과 다른 항목에 대한 가지를 합친 것
- root node : 트리 맨 위에 있는 노드
- degree : 각 노드에 뻗어나온 가지의 수
- 단말 노드(termianl node) : 자식이 없는 노드
이진 트리의 운행법
트리의 운행범
- Pre order : root - left -right
- In order : left - order - right
- Post order : left - right - root
수식의 표기법
- 전위 표기
- 후위 표기
- 중위 표기 : 우린 보통 중위 표기
스레드 이진 트리
이진트리에서 발생하는 null 링크를 트리 운행에 필요한 다른 노드의 포인터로 사용하도록 고안된 트리
어떻게 사용하는가?
- 어떤 노드의 왼쪽이 nil일 경우, 그 노드 직전에 검사된 노드를 가리키는 포인터로 사용
- 어떤 노드의 오른쪽이 nil일 경우, 그 노드의 직후에 검사될 노드를 가리키는 포인터로 사용
해당 노드의 직전, 직후 노드는 트리의 운행법에 따라 방문한 노드의 순서대로 결정한다.
그래프
그래프의 정의
- 그래프 G는 정점과 간선의 두 집합으로 이루어진다.
- 간선의 방향성 유무에 따라 방향 그래프와 무방향 그래프로 구분된다.
- tree는 사이클이 없는 그래프이다.
용어 정리
- Loop : 한 정점에서 그 자신에 이어지는 간선 loop
- 차수(degree)
- 무방향 그래프 : 한 정점에 여결된 간선의 수
- 방향 그래프 : 진입 차수 + 진출 차수
- 경로
- 경로 길이 : 경로 상에 있는 간선들의 수
- 단순 경로 : 같은 간선을 두번 이상 지나지 않는 경로
- 기본 경로 : 같은 정점을 두번 이상 지나지 않는 경로
- 사이클 : 같은 정점에서 시작과 끝이 이루어지는 경로
- 최대 사이클 : 사이클을 이루는 경로 중 최대 경로 길이
내부 정렬
삽입 정렬
- 순서화된 파일에 새로운 하나의 레코드를 순서에 맞게 삽입시켜 정렬
- 평균 최악 모두 수행 시간 복잡도는 O(n^2)
쉘 정렬
- 삽입 정렬을 확장한 개념
- 입력 파일이 부분적으로 정렬되어 있는 경우에 유리
- 평균 수행 복잡도는 n^1.5, 최악의 수행 시간 복잡도는 n^2
선택 정렬
- n개의 레코드 중에서 최소값을 찾아 첫 번째 레코드 위치에 두고 나머지 (n-1)개중에 앞의 행위를 반복함
- 평균과 최악 모두 수행시간 복잡도는 n^2
버블 정렬
- 주어진 파일에서 인접한 두개의 레코드 키값을 비교하여 그 크기에 따라 레코드 위치를 서로 교환하는 정렬 방식
- 계속 정렬 여부를 플래그 비트로 결정
- 평균과 최악 모두 수행 시간 복잡도는 n^2
퀵 정렬
- 위치에는 관계없이 임의의 키를 분할 원소로 사용할 수 있다.
- 정렬 방식 중 가장 빠른 방식이다
- 분할과 정복을 통해 자료를 정렬한다.
- 평균 수행 시간 복잡도는 nlog2n이고 최악의 수행시간 복잡도는 n^2
힙 정렬
- 전이진 트리를 이용한 정렬 방식이다.
- 평균과 최악 모두 시간 복잡도는 nlog2n이다.
2-way 합병 정렬
- 이미 정렬되어 있는 두 개의 파일을 한 개의 파일로 합병하는 정렬 방식이다.
- 평균과 최악 모두 시간 복잡도는 nlog2n
기수 정렬
- 기수 정렬은 queue를 이용하여 자릿수별로 정렬하는 방식이다.
- 평균과 최악 모두 시간 복잡도는 dn이다.
검색 - 해싱
해싱의 개요
- DAM(직접 접근) 파일을 구성할 때 사용되며 접근 속도는 빠르나 기억공간이 많이 요구된다.
- 다른 방식에 비해 검색 속도가 가장 빠르다
- 삽입 삭제 작업의 빈도가 많을 때 유리한 방식이다.
- 키 - 주소 변환 방법이라고도 한다.
해싱 관련 용어
- Hash table : 레코드를 한 개 이상 보관할 수 있는 bucket들로 구성된 기억공간, 보조기억장치, 주기억장치에 구성할 수 있다.
- 버킷 : 하나의 주소를 갖는 파일의 한 구역을 의미, 버킷의 크기는 같은 주소에 포함 될 수 있는 레코드의 수를 의미
- slot : 한 개의 레코드를 저장할 수 있는 공간으로 n개의 슬롯이 모여 하나의 버킷 형성
- Collision(충돌 현상) : 서로 다른 두 개 이상의 레코드가 같은 주소를 갖는 현상
- Synonym : 충돌로 인해 같은 home address를 갖는 레코드들의 집합이다
- Overflow : 계산된 home address의 bucket 내에 저장할 기억공간이 없는 상태
해싱 함수
K : KEY ,Q = Prime
제산법
- 레코드 키를 해시표의 크기보다 큰 수 중에서 가장 작은 소수로 나눈 나머지를 홈 주소로 삼는 방식
- h(K) = K mod Q
제곱법
- 레코드 키 값을 제곱한 후 그 중간 부분의 값을 홈 주소로 삼는 방식
폴딩법
- 레코드 키 값을 여러 부분으로 나눈 후 각 부분의 값을 더하거나 XOR한 값을 홈 주소로 삼는 방식이다.
기수 변환법
- 키 숫자의 진수를 다른 진수로 변환시켜 주소 크기를 초과한 높은 자릴수는 절단하고 이를 다시 주소범위에 맞게 조정하는 방법이다.
대수적 코딩
- 키 값을 이루고 있는 각 자리의 비트 수를 한 다항식의 계수로 간주 하고 이 다항식을 해시표의 크기에 의해 정의된 다항식으로 나누어 얻은 나머지 다항식의 계수를 홈주소로 삼는 방식이다.
계수 분석법
- 계수 분석법은 키 값을 이루는 숫자의 분포를 분석하여 비교적 고른 자리를 필요한만큼 택해서 홈 주소로 삼는 방식이다.
Overflow 해결 방법
- 개방 주소법(open addressing)
- 선형 방법이라고도 하는데, collision이 발생했을 때 순차적으로 다음 빈 버킷을 찾아 저장하는 방법
- 폐쇄 주소법(close addressing)
- Overflow된 레코드들을 별도의 overflow 영역에 저장하고 chain으로 홈버킷에 연결
- direct chaining
- 해시표 내의 빈 자리 에 overflow 레코드를 보관
- indirect chaining
- 해시표와는 별도의 기억 공간에 overflow 레코드를 보관한다.
- 재해싱
- collision이 발생하면 새로운 해싱 함수로 새로운 홈 주소를 구하는 방식
파일 편성
순차 파일 (sequential file) = 순서 파일
입력되는 데이터들을 논리적 순서에 따라 물리적 연속 공간에 순차적으로 기록하는 방식
- 순차접근이 가능한 자기테이프에서 사용한다.
- 변동사항이 크지 않고 기간별로 일괄 처리를 주로 하는 경우에 적합
순차 파일의 장점
- 기록 밀도가 높아 기억공간을 효율적으로 사용
- 매체 변환이 쉬워 어떠한 매체에도 적용할 수 있다.
- 레코드가 키 순서대로 편성되어 취급이 용이하다
- 레코드를 기록할 때 사용한 키 순서대로 레코드를 처리하는 경우 다른 편성법 보다 처리 속도가 빠르다
순차 파일의 단점
- 파일에 새로운 레코드를 삽입,삭제하는 경우 파일 재구성을 위해 전체를 복사해야하므로 시간이 많이 소요
- 데이터 검색시 처음부터 순차적으로 검색하기 때문에 검색 효율이 낮고, 시간 및 응답 시간이 느림
색인 순차 파일(indexed sequential file)
- 순차 처리와 랜덤 처리가 모두 가능한 레코드들을 키값 순으로 정렬시켜 기록하고, 레코드의 키 항목만을 모은 색인을 구성하여 편성하는 방식
- 색인을 이용한 순차적인 접근 방법을 제공하여 ISAM(index sequential access method)이라고 함
- 레코드를 참조할 때 색인을 탐색한 후 색인이 가리키는 포인터(주소)를 사용하여 직접 참조할 수 있다.
- 일반적으로 자기 디스크에 많이 사용되며, 자기 테이프에서는 사용할 수 없다.
색인 순차 파일의 구성
색인 순차 파일은 기본구역, 색인 구역, 오버플로 구역으로 구성
기본 구역
- 실제 레코드들을 기록하는 부분으로 각 레코드는 키 값 순으로 저장
색인 구역
- 기본 구역에 있는 레코드들의 위치를 찾아가는 색인이 기록되는 부분으로 트랙 색인 구역, 실린더 색인 구역, 마스터 색인 구역이 있다.
색인 구역 기능 트랙 색인 구역 기본 구역의 한 트랙 상에 기록되어 있는 데이터 레코드 중의 최대 키 값과 주소가 기록되는 색인으로, 한 실린더당 하나씩 만들어진다. 처리할 레코드가 실제로 어느 트랙에 기록되어 있는지 판별할 수 있게 함 실린더 색인 구역 각 트랙 색인의 최대키 값과 해당 레코드가 기록된 실린더의 정보가 기록되는 색인, 한 파일당 하나씩 만들어진다. 마스터 색인 구역 실린더 색인 구역의 정보가 많을 경우 그것을 일정한 크기의 블록으로 구성하는데, 이때 해당 레코드가 어느 실린더 색인 구역에 기록되어 있는지를 기록하는 색인 오버플로 구역
- 기본 구역에 빈 공간이 없어 새 레코드가 삽입 불가할 때 대비하여 예비적으로 확보해둔 부분
오버플로 구역 기능 실린더 오버플로 구역 각 실린더마다 만들어지는 오버플로 구역,해당 실린더의 오버플로 내용을 기록 독립 오버플로 구역 실린더 오버플로 구역에서 데이터를 더이상 기록 할 수 없을 때를 대비하는 구역 색인 순차 파일의 장점
- 융통성
- 효율적인 검색 가능, 레코드의 삽입 삭제 갱신이 용이
- 레코드를 추가 및 삽입하는 경우, 파일 전체를 복사할 필요가 없음
색인 순차 파일의 단점
- 색인 구역과 오버플로 구역을 구성하기 위한 추가 기억공간이 필요
- 파일 사용 중 오버플로 레코드가 많아지면 파일을 재편성해야한다.
- 파일이 정렬되어 있어야 하므로 추가 삭제가 많으면 효율이 떨어짐
- 색인을 이용하여 액세스 하기 때문에 액세스 시간이 랜덤 편성 파일보다 느리다.
VSAM 파일
- VSAM : Virtual storage access method ,동적 인덱스 방법을 이용한 색인 순차 파일
- 제어 구간, 제어 구역, 순차 세트 , 인덱스 세트로 구성
이름 | 기능 |
---|---|
제어 구간 | 데이터 레코드가 저장되는 부분 |
제어 구역 | 몇 개의 제어 구간을 모아 놓은 것 |
순차 세트 | 제어 구역에 대한 인덱스를 저장한 것 |
안덱스 세트 | 순차 세트의 상위 인덱스 |
- 기본 구역과 오버플로 구역을 구분하지 않음
- 레코드를 삭제하면 그 공간을 재사용할 수 있다.
- 제어 구간에 가변 길이 레코드를 쉽게 수용할 수 있다.
직접 파일(direct file, random file)
DAM파일이라고도 불림
레코드에 특정 기준으로 키 할당, 해시 함수를 이용하여 키에 대한 보조기억장치의 물리적 상대 레코드 주소를 계싼한 후 해당하는 주소에 레코드를 저장
레코드는 해시 함수에 의해 계산된 물리적 주소를 통해 접근
임의 접근이 가능한 자기 디스크나 자기드럼을 사용
직접 파일의 장점
- 직접 접근 기억장치(DASD)의 물리적 주소를 통하여 파일의 각 레코드에 직접 접근하거나 기록할 수 있으며 접근 및 기록의 순서에는 제약이 없다.
- 접근 시간이 빠르고 레코드의 삽입, 삭제, 갱신이 용이
- 어떤 레코드라도 평균 접근 시간 내에 검색이 가능하다.
직접 파일의 단점
- 레코드의 주소 변환과정(HASH)이 필요하며 이 과정으로 시간이 소요 됨
- 기억 공간의 효율이 저하될 수 있음
- 기억 장치의 물리적 구조에 대한 지식 필요, 프로그래밍 작업이 복잡
- 충돌이 발생할 염려가 있으므로, 이를 위한 기억공간의 확보가 필요
역 파일
특정 항목을 여러 개의 색인으로 만들어 항목별 특성에 맞게 작업할수 있도록 한 파일로, 다중 키 파일에 속한다.
- 하나 또는 몇 개의 색인값을 결합하여 레코드의 주소를 결정할 수 있다.
- 각 응용마다 적합한 색인을 별도로 구현 할 수 있다.
- 새로운 레코드를 파일 중간에 삽입하기 쉽고, 검색 속도가 빠르다
- 데이터 파일에 접근하지 않아 질의 응답시간이 줄어들고, 처리가 비교적 쉽다.
- 질의를 만족하는 레코드 검색 시 한 번씩만 접근하면 된다.
- 색인의 각 항목들의 길이가 가변적이다.
다중 리스트 파일
- 다중 키 파일의 한 종류로 각 키에 대하여 색인을 만든 다음 각 데이터 레코드들 간에 다 중 리스틀 구축하여 구성한 파일이다.
- 색인은 동일한 키 값을 갖는 데이터 레코드 중 하나의 레코드에 대한 포인터만을 갖고 후속데이터는 포인터로 추적하도록함
- 색인의 각 항목들의 길이가 고정적이므로 관리가 용이하며 수정 삭제 전체 검색이 효율적
다중 링 파일
- 다중 링 파일은 같은 특성을 가진 레코드들을 일련의 포인터로 연결하여 구성한 것이다.
- 같은 항목값을 가진 레코드들을 한꺼번에 처리하는 데 효과적이다.
- 기억 장소가 절약되고 자료의 중복성을 배제할 수 있다.
- 레코드 형식이 다른 경우에도 처리가 가능하다.