fib
에 사용되는 입력값 $n$의 크기는 $n$을 이진법으로 표기했을 때의 길이인
$(\lfloor\lg n\rfloor + 1)$ 이다.fib2
와 fib3
비교 참조# 리스트의 항목 모두 더하기
def sum(S):
result = 0
for i in range(len(S)):
result = result + S[i]
return result
seq = list(range(11))
sum(seq)
55
# 교환정렬
def exchangesort(S):
for i in range(len(S)):
for j in range(i+1, len(S)):
if (S[j] < S[i]):
S[i], S[j] = S[j], S[i]
seq = [1, 4, 5, 2, 7, 4]
exchangesort(seq)
print(seq)
[1, 2, 4, 4, 5, 7]
S[j]
와 S[i]
의 비교)j
-반복문이 실행할 때마다 조건문 한 번씩 실행# 교환정렬
def exchangesort_1(S):
count = 0
for i in range(len(S)):
for j in range(i+1, len(S)):
count += 1
if (S[j] < S[i]):
S[i], S[j] = S[j], S[i]
return count
seq = [1, 4, 5, 2, 7, 4]
print(exchangesort_1(seq))
15
단위연산: 교환하는 연산 (S[i]
와 S[j]
의 교환)
입력크기: 정렬할 항목의 수 $n$
최악의 경우 분석:
최악의 경우
이때, 조건문 실행 횟수와 동일하게 실행됨. 즉, 일정 시간복잡도와 동일.
$$W(n) = \frac{(n-1)n}{2}$$
S
의 항목과 값 x
와의 비교연산S[location] != x
최악의 경우 분석:
x
가 리스트의 마지막 항목이거나, 리스트에 포함되지 않은 경우,
단위연산이 $n$번 수행된다. 즉,
$$W(n) = n$$
S
와 x
)에 따라서 검색횟수가 달라지므로,
일정 시간복잡도 분석 불가능.S
의 항목과 값 x
와의 비교연산S[location] != x
x
가 리스트 S
안에 있음x
가 리스트의 특정 위치에 있을 확률 동일, 즉 $1/n$. 단, $n$은 리스트 S
의 길이.x
가 리스트의 $k$ 번째 있다면,
S
를 찾기 위해서 수행하는 단위연산의 횟수는 $k$.x
가 리스트 S
안에 없을 수도 있음.x
가 리스트 S
안에 있을 확률: $p$x
가 배열에 없을 확률: $1-p$x
가 리스트의 $k$ 번째 항목일 확률: $p/n$# 교환정렬
def exchangesort_2(S):
count = 0
for i in range(len(S)):
for j in range(i+1, len(S)):
if (S[j] < S[i]):
count += 1
S[i], S[j] = S[j], S[i]
return count
seq = [1, 2, 4, 4, 5, 7]
print(exchangesort_2(seq))
0
S
의 항목과 값 x
와의 비교연산S[location] != x
x
가 S[0]
일 때, 입력의 크기에 상관없이 단위연산이 한 번 수행