본문 바로가기

컴퓨터 언어/알고리즘

3.3, 3.8 알고리즘

문제의 표기 방법

문제: 답을 찾고자 던지는 질문

파라미터: 문제에서 특정값이 없는 변수. x,y,,

문제의 사례 (입력): 파라미터에 특정 값을 지정한 것

사례에 대한 해답 (출력): 주어진 사례의 답

 

 

c++과 의사코드의 차이점

exchange x and y : x와 y의 값을 바꾸고 싶다

값을 swap 바꿔도 xy가 안바뀌어서

pointer를 씀. 함수에서는 포인터를 바꿔야 제대로 swap가 일어난다

-> 근데 매번 포인터, & 써야해서 reference 참조로 표기

reference에서는 엔퍼센드(&) 사용

 


순차검색 알고리즘

의사코드(설명&언어 c++)는 c++와 다르게 1부터 시작 (c++은 무조건 0부터 시작. 위 참고)

n=3에 위치하면 while 만족안해서 끝나겠지

 

array가 n개니까 최악의 경우 마지막 n개까지 다 찾아봐야할 수도.

 


 

이분검색 알고리즘

1.2만 보면돼

배열 32개까지 정렬되어 있다고 가정해 설명, 가운데부터 찾아본다.

high = n. 배열의 최대 크기

 

처음에 16을 찾는다.

x가 16보다 크다. ->17~32 이분검색. 24 ->28->31->32,,,

6=lg32+1 => lg= log2

 


 

어떤 알고리즘으로 피보나치를 빠르게 구할 수 있을까?

 

1.재귀적 방법

n=5 일때, f(2)를 세번이나 중복계산

 

함수 호출 횟수 계산

0.1 제외하고

n이 커질수록 계산하는 항의 개수가 커진다. => t(n-1) >t(n-2)

따라서

t(n-1)+t(n-2) +1 > t(n-2) +t(n-2) +1 > 2* t(n-2) 

 

t(n-2) = t(n-3)+t(n-4) > t(n-4)+ t(n-4) = 2*t(n-4) 를 위에 대입하면.. > 2^2 * t(n-2)

이를 반복하면

호출횟수가 t(n) > 2^n/2 임을 알 수 있다.

 

 

이를 귀납법으로 증명가능