LEC

[컴퓨터알고리즘] 1. Analysis of Algorithms

hyu_na 2023. 4. 4. 15:49

TEXTBOOK - [Introduction to Algorithms]

2.1 Insertion sort - 삽입정렬

+자료구조

삽입정렬은 손 안의 카드를 정렬하는 방법과 유사하다. 새로운 카드가 들어오면 새로운 카드를 기존의 정렬된 카드 사이의 올바른 자리에 삽입함으로써 정렬을 유지한다. 이와 같은 작업을 카드 수 만큼 반복하면 전체 카드가 정렬된다.

pseudo코드 

Insertion-sort(A,n)  >A[1...n]
1.  for j<-2 to n
2.     do key <-A[j]
3.        i<- j-1
4.        while i>0 and A[i]>key
5.            do A[i+1] <-A[i]
6.                 i <- i-1
7.        A[i+1]=key

1. 인덱스 2부터 시작한다. 인덱스 1은 이미 정렬된 것으로 볼 수 있다.

2. 현재 삽입될 숫자인 j번째 정수를 key 변수로 복사한다.

3. 현재 정렬된 배열은 j-1까지이므로 j-1부터 역순으로 조사한다

4. i값이 0보다 크고 key 값보다 정렬된 배열에 있는 값이 크면

5. i번째를 i+1번째로 이동한다.

6. i를 하나 감소한다.

7. i번째 정수가 key보다 작으므로 i+1번째가 key 값이 들어갈 위치이다.

 

Correctness 정확성 

input값이 이미 정렬되어있거나 반복되는 요소를 포함하더라도 sorting이 항상 성립해야함

optimization과 같이 최적을 찾는 solution에서는 명백하지 않다

 

How to prove correctness

counter example 반례증명

-모든 작은 예시

-매우 크거나 작은 값 등등 생각 

*반례를 찾지 못했다고 해서 이 알고리즘이 정확한 것은 아님

 

Loop invariants 

[증명 by induction(귀납법)]

주장 - S(n)은 n>=1인 모든 n에 대해 참이다

초기 조건 - n=1일때 참임을 보인다

귀납적 가설 - 임의의 k에 대해 n=k일때 참임을 가정

증명(show) - n=k+1일때 참임을 보여라

 

Initialization(basis) 초기조건 - 루프불변성은 루프의 첫 반복 전에 참이다

Maintenance 유지조건 - 루프 반복전에 참임을 가정하고(귀납적 가설) 다음 반복전에 참이 유지되는지 보여라 (증명)

Termination 종료조건 - 루프가 종료될 때 루프 불변성은 알고리즘이 정확성을 보여주는 유의미한 특성이 있음을 보여라

 

Insertion-sort(A,n)  >A[1...n]
  for j<-2 to n
     do key <-A[j] //A[1]은 정렬되어있으므로 초기 조건을 만족 //반복 j이전에 참이라 가정
        i<- j-1
        while i>0 and A[i]>key
            do A[i+1] <-A[i]
                 i <- i-1
        A[i+1]=key //j+1 반복 전에 참이다

 

 

2.2 Analazing algorithms

Efficiency

Correctness만으로 충분하지 않음

How to measure complexity

-> Machine-independent : RAM(random-access machine) model

 

Asymptotic Analysis 점근적 분석

running time 은 input의 size에 의존적이다

큰 배열은 정렬에 더 많은 시간을 필요로 한다

input의 크기가 n일때 걸리는 시간을 T(n)이라 하면 

n이 무한히 커질때 T(n)을 보는 것

차수가 클때 증가하는 input size n에 더 지배적이다 

 

Insertion sort의 running time

이미 정렬되어있거나 길이가 짧으 정렬이 더 쉽다 

guarantee를 위해 upper bounds(상한)을 찾아야함 

 

분석의 종류

  • worst-case : maximum time

내부 루프문의 실행 = an^2 +bn+c

  • average-case : expected time

내부 루프문의 실행 = an^2 +bn+c

  • best-case : fast on some input

-이미 정렬 되어있을때 

내부 루프문이 실행될 필요 없음 = an+b

 

1 << logn << n << nlogn << n^2 << n^3 << 2^n << n!

 

2.3 Designing algorithms

Recursive algorithms

큰 문제를 작은 것으로 divide 하고 작은 문제를 재귀적으로 혹은 명시적으로 해결한 루 이 해결책을 결합해 본래의 문제를 해결하는 방법 --> devide and conquer 분할 정복 기법

 

Merge sort 합병 정렬 

MERGE-SORT    A[1 .. n]
  1. IF n=1, done 
  2. Recursively sort A[1 ..⌈n/2⌉] and  A[⌈n/2+1 .. n⌉] 
  3. Merge the 2 sorted lists

 

Recursive algorithm 의 correctness

귀납법에 의해

1. 초기 조건 - 작은 예시에 만족함을 증명 

2. 귀납적 가설 - 모든 sub 문제들의 정확성을 가정

3. 단계 - 귀납적 가설이 맞다면 본래의 문제의 정확성을 보여라

 

Correctness of merge sort

MERGE-SORT    A[1 .. n]
  1. IF n=1, done 
  2. Recursively sort  A[1 ..⌈n/2⌉] and  A[⌈n/2+1 .. n⌉] 
  3. Merge the 2 sorted lists

=>>

       1. 초기조건 - n=1이면 A[1 ..1]은 이미 정렬되어있기때문에 correct answer

       2. 귀납적 가설 - A[1 ..⌈n/2⌉] and  A[⌈n/2+1 .. n⌉] 이 correctly sorts라 가정

       3. 단계 - 전체 배열 A[1 ..⌈n/2⌉] 과  A[⌈n/2+1 .. n⌉] 은 합병 후에 정렬된다 

 

Recurrence for 합병 정렬