본문 바로가기

공부/자료구조 | 알고리즘

(23)
[알고리즘] 2원 합병 정렬 merge sort 2원 합병 정렬 주요 특징 대표적인 분할 및 정복 기법 자료를 거의 동일한 크기의 두 그룹으로 나누고, 각각을 별도로 정렬한 후, 합병 순환 알고리즘 방식 복잡도분석 합병(merge)에 따른 비교회수 : n번 = O(n) 순환방정식 : T(n) = 2 T(n/2) + n 전체 비교 회수 : O(n log n) 장단점 수행 시간 우수, 단 순환 알고리즘의 한계 내포 추가 기억장소 사용량 : 추가 배열용 n개 필요 전체 총 2n개의 기억장소 필요, O(n) void merge_sort(data A[], int L, int R) { int m; if(R > L) { m = (R+L) / 2; merge_sort(A, L, m); merge_sort(A, m+1, R); merge(A, L, R, m); } }..
[알고리즘] 삽입 정렬 insertion sort 삽입 정렬 특징 하나씩 삽입하며 정렬한다. k번째 자료에 대해 생각할 때, 앞의 k-1개 자료는 이미 정렬되어 있다. 복잡도분석 K번째 자료의 비교 회수 최상 1회, 최악 (k-1)회, 평균 (k/2) 전체 : 최상 (n-1), 최악 1+2+...+(n-1)=O(n2) 장단점 (+) 순서가 틀린 자료가 적을 때 (즉, 위에서 m이 작을 때) (+) 20-25개 이하 정렬에 효과적 (-) 이동량 증가 (앞서 이동한 자료를 재이동) -> 리스트구조, 선택 정렬이 더 효과적 void insertion_sort(data A[], int n) { int i, j; data temp; for(i = 2; i 1 && A[j-1] > temp) { A[j] = A[j-1]; j--; } A[j] = temp; } }..
[알고리즘] 버블 정렬 bubble sort / flag 버블 정렬 주요 특징 여러 명칭 : sinking/ripple/exchange/shifting 등 인접한 두 원소들을 서로 비교, 필요시 교환 각 단계에서 대상 원소 중 최대값이 제일 뒤로 이동 (cf) 적용방법에 따라, 최소값이 처음으로 이동 가능 K단계 적용 후, 뒤쪽 k개는 이미 정렬됨 복잡도 분석 K번째 단계의 비교 회수 : (n-k)회 전체 비교 회수 : (n-1)+(n-2)+…+2+1 = O(n^2) (cf) 자료 교환 회수는 기본적으로 비교 회수와 동일 문제점 및 개선 한자료가여러번교환될수있음 (cf) 선택정렬 이미 정렬된 경우에도 계속 수행 -> flag 이용 #include using namespace std; const int SIZE = 15; int L[SIZE] = {10,4, 7..
[알고리즘] 정렬 / 정렬 프로그램 완성 정렬 내부정렬 주기억장치내 저장된 소규모 자료 대상 삽입정렬, 선택정렬, 버블정렬, 쉘정렬, 퀵정렬, 2원합병정렬, 히프정렬, 기수정렬 등 외부정렬 테이프 등에 저장된 대규모 자료 대상 자연2원합병, 균형2원합병, 균형m원합병, 다단계합병 등 내부정렬 입력 자료 입력 데이터는 대부분 배열에 저장 일부는 연결리스트 사용 A[1],A[2],...,A[n]을 입력으로 봄 간혹, 경우에 따라 A[0]를 포함하기도 함 ( C 언어의 경우, A[0]부터 시작 ) 정렬 프로그램 완성 void sort() { /* 이 곳에 알맞은 내용을 추가하시오. */ /* 입력 데이타는 L[]에 들어 있으면, 전체 원소 개수는 SIZE이다. */ } #include using namespace std; const int SIZE ..
[알고리즘] 순환 알고리즘 Recursion / 하노이 탑 순환 알고리즘 (recursive algorithm) 직접순환(direct recursion), 간접순환(indirect recursion) 간결하고 명확 but, 일반적으로 수행속도 및 기억장소 사용에 비효율적이다. 순환(recursion) vs 반복(iteration) 순환 알고리즘의 적용 예 Factorial : n! = n * (n-1)! = n*(n-1)*...*2*1 Fibonacci 수열 : 1, 1, 2, 3, 5, 8, 13, 21, .... BNF(Backus Naur Form) 합계 계산(SUM) 정렬, 탐색, 트리 문제 등 다양한 경우에 실제 적용된다. 순환 알고리즘의 복잡도 순환 알고리즘의 일반적인 단계 분할, 정복, 결합 단계 순환 방정식(recurrence equation) 이..
자료구조와 알고리즘의 관계 자료구조와 알고리즘의 관계 프로그램 = 자료구조 + 알고리즘 (+ 프로그래밍 언어) 자료구조 vs 알고리즘 처리할 대상 vs 처리하는 방법 예) 음식 : 요리 재료와 요리법 자료구조 : 자료를 어떻게 분류,보관, 사용할 것인가? 알고리즘 : 자료를 어떻게 처리하여 원하는 결과를 얻을 것인가? 기본적인 자료구조 배열(array) 동일 종류의 원소들로 구성 (논리적으로) 연속된 기억장소에 저장 배열명과 인자(index)로 표현 차원 : 1차원/2차원 (e.g. A[], B[5],C[3][4] 등) 연결리스트(linked list) 주로 노드(node)와 연결 링크(link)로 구성 배열의 단점 제거 : 삽입/삭제가 용이 단일 연결 리스트, 이중 연결 리스트 등 스택(stack), 큐(queue) 관련 함수 ..
[자료구조] 원형 큐 Circular Queue What is Circular Queue? 원형 큐는 잘못된 포화 상태 인식을 방지하는 보다 효과적인 큐로서 1차원 배열의 처음과 끝이 서로 연결되었다고 본다. 인덱스도 이에 따라 변경, %(나머지) 연산 사용 잘못된 포화 상태 인식이란, 큐에서 삽입과 삭제를 반복하면서 앞부분에 빈자리가 있어도 rear = n-1 상태이면 포화상태로 인식하고 더 이상의 삽입을 수행하지 않는 것이다. 원형 큐는 전단과 후단을 관리하기 위한 2개의 변수가 필요하다. 두 변수의 값 증가시 % M 사용, M은 큐의 크기 front: 첫번째 요소 하나 앞의 인덱스 : front = (front+1) % M rear: 마지막 요소의 인덱스 : rear = (rear+1) % M 공백상태와 포화상태 공백상태 : front == re..
[자료구조] 큐 Queue / 연결리스트를 이용한 큐의 구현 연결리스트를 이용한 큐의 구현 배열 대신 연결리스트로 원소들을 관리 큐의 원소 : 단순 연결 리스트의 노드 큐의 원소의 순서 : 노드의 링크 포인터로 연결 변수 front : 첫 번째 노드를 가리키는 포인터 변수 (초기 null) 변수 rear : 마지막 노드를 가리키는 포인터 변수 (초기 null) 주요 특징 배열을 이용할 경우에 비해, 크기 제한이 거의 없음 동적 메모리 할당으로 기억장소 사용에 제한이 적음 큐에서 enQueue 및 deQueue 방법은 단순연결리스트의 삽입/삭제 방법과 거의 동일 배열의 인덱스 대신 포인터 사용에 따른 부담은 존재 큐의 상태 초기 상태 : front = rear = null 공백 상태 : front = rear = null 초기 상태와 공백 상태가 동일! 큐가 꽉 차..