# 이분검색 알고리즘
def binsearch(S, x):
low, high = 0, len(S)-1
location = -1
# while 반복문 실행횟수 확인용
loop_count = 0
while low <= high and location == -1:
loop_count += 1
mid = (low + high)//2
if x == S[mid]:
location = mid
elif x < S[mid]:
high = mid - 1
else:
low = mid + 1
return (location, loop_count)
seq = list(range(30))
val = 5
print(binsearch(seq, val))
(5, 5)
seq = list(range(30))
val = 10
print(binsearch(seq, val))
(10, 3)
seq = list(range(30))
val = 20
print(binsearch(seq, val))
(20, 4)
seq = list(range(30))
val = 29
print(binsearch(seq, val))
(29, 5)
seq = list(range(30))
val = 30
print(binsearch(seq, val))
(-1, 5)
seq = list(range(30))
val = 100
print(binsearch(seq, val))
(-1, 5)
while
반복문의 실행횟수가 거의 변하지 않음.이분검색으로 특정 값의 위치를 확인하기 위해서
$S$의 항목 몇 개를 검색해야 하는가?
while
반복문이 실행될 때마다 검색 대상의 총 크기가 절반으로 감소됨.배열 크기 |
순차 검색 |
이분 검색 |
---|---|---|
$n$ | $n$ | $\lg n + 1$ |
$128$ | $128$ | $8$ |
$1,024$ | $1,024$ | $11$ |
$1,048,576$ | $1,048,576$ | $21$ |
$4,294,967,296$ | $4,294,967,296$ | $33$ |
# 피보나찌 수 구하기 알고리즘(재귀)
def fib(n):
if (n <= 1):
return n
else:
return fib(n-2) + fib(n-1)
fib(3)
2
fib(6)
8
fib(10)
55
fib
함수 분석¶fib(5)
를 계산하기 위해 fib(2)
가 세 번 호출됨. 아래 나무구조 그림 참조.fib
함수 호출 횟수¶fib(n)
을 계산하기 위해 fib
함수를 호출한 횟수. fib(n)
을 위한 재귀 나무구조에 포함된 마디(node)의 개수# 피보나찌 수 구하기 알고리즘 (반복)
# 비효율적 메모리 활용
def fib2(n):
f = []
f.append(0)
if n > 0:
f.append(1)
for i in range(2, n+1):
fi = f[i-2] + f[i-1]
f.append(fi)
return f[n]
fib2(3)
2
fib2(6)
8
fib2(10)
55
fib2(13)
233
fib2(백만)
계산 가능. 몇 분 걸림. fib2
함수 분석¶fib2
함수 호출 횟수 $T(n)$f[0]
부터 f[n]
까지 한 번씩만 계산$n$ |
$n+1$ |
$2^{n/2}$ |
반복 |
재귀 |
---|---|---|---|---|
$40$ | $41$ | $1,048,576$ | $41$ ns | $1048$ $\mu$s |
$60$ | $61$ | $1.1 \times 10^9$ | $61$ ns | $1$ 초 |
$80$ | $81$ | $1.1 \times 10^{12}$ | $81$ ns | $18$ 분 |
$100$ | $101$ | $1.1 \times 10^{15}$ | $101$ ns | $13$ 일 |
$120$ | $121$ | $1.2 \times 10^{18}$ | $121$ ns | $36$ 년 |
$160$ | $161$ | $1.2 \times 10^{24}$ | $161$ ns | $3.8 \times 10^7$ 년 |
$200$ | $201$ | $1.3 \times 10^{30}$ | $201$ ns | $4 \times 10^{13}$ 년 |
fib2
함수보다 더 많은 피보나찌 수 계산 가능. # 피보나찌 수 구하기 알고리즘 (반복)
# 효율적 메모리 활용
def fib3(n):
f = []
f.append(0)
if n > 0:
f.append(1)
for i in range(2, n+1):
fi = f[0] + f[1]
f[0], f[1] = f[1], fi
return f[1]
fib3(백만)
계산 가능. 몇 초 걸림. fib2(백만)
에 비해 백 배정도 빠름.