def seqsearch (n, S, x):
location = 1
while (location <= n and S[location] != x):
location += 1
if (location > n):
location = 0
return location
def sum (n, S):
result = 0
for i in range(1, n + 1):
result = result + S[i]
return result
def exchange (S):
n = len(S)
for i in range(n - 1):
for j in range(i + 1, n):
if (S[i] > S[j]):
S[i], S[j] = S[j], S[i] # swap
C = A * B, cij = ai1b1j+ai2b2j
def matrixmult (A, B):
n = len(A)
C = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
for k in range(n):
C[i][j] += A[i][k] * B[k][j]
return C
입력리스트의 조건에 따라 알고리즘의 선택이 달라짐
def binsearch(n, S, x):
low = 1
high = n
location = 0
while (low <= high and location == 0):
mid = (low + high) // 2
if (x == S[mid]):
location = mid
elif (x < S[mid]):
high = mid - 1
else:
low = mid + 1
return location
리스트의 크기 | 순차 탐색의 비교 횟수 | 이분 검색의 비교 횟수 |
---|---|---|
128 | 128 | 8 |
1024 | 1024 | 11 |
1,048,576 | 1,048,576 | 21 |
4,294,987,296 | 4,294,987,296 | 33 |
def fib (n):
if (n <= 1):
return n
else:
return fib(n - 1) + fib(n - 2)
그치만 이 알고리즘은 같은 값을 계속 중복해서 계산하므로 비효율적,,
중복해서 계산 안하려면 어떻게 해야할까
이미 계산한 피보나치 항의 값을 저장하면 되지 않을까
def fib2 (n):
f = [0] * (n + 1)
if (n > 0):
f[1] = 1
for i in range(2, n + 1):
f[i] = f[i - 1] + f[i - 2]
return f[n]
위의 알고리즘에서 리스트를 사용하지 않고 반복문으로 구하려면?
나중ㅇㅔ 알아보자,,,!!
def sum (S):
n = len(S)
result = 0
for i in range(n):
result += S[i]
return result
위의 배열 원소 합을 구하는 알고리즘의 시간복잡도를 분석해보자.
입력 크기 는 리스트S의 원소 개수(n)이고,
단위 연산 은 리스트의 원소를 result에 더하는 것
for문은 항상 n번 실행하므로 시간복잡도는?? T(n) = n
배열 원소의 합을 구하는 알고리즘의 시간복잡도
T(n) = n
def exchange (S):
n = len(S)
for i in range(n - 1):
for j in range(i + 1, n):
if (S[i] > S[j]):
S[i], S[j] = S[j], S[i] # swap
그럼 앞에서 봤던 exchange sort의 시간복잡도를 분석해보자~~
단위 연산 은 S[i]와 S[j]를 비교하는 것
입력 크기 는 정렬할 리스트S 의 원소 개수 = n
3중 for루프가 항상 n번 실행됨
그러므로 시간복잡도는 T(n) = n n n = n^3
근데,, 위의 단위 연산의 실행 횟수가 항상 일정할까?
순차 탐색은 찾는 원소가 어디 있느냐에 따라 다름!!
그럼 입력 사례에 따른 시간 복잡도를 분석해보자
def seqsearch (n, S, x):
location = 1
while (location <= n and S[location] != x):
location += 1
if (location > n):
location = 0
return location
다시 보자.
단위 연산 은 리스트의 원소와 주어진 키x와 비교하는 것이고,
입력 크기 는 리스트 원소의 개수 n이다
최악의 경우 는 리스트의 모든 원소와 x를 비교하는 것,
최적의 경우는 찾는 원소가 리스트의 제일 앞에 있어서 한번만 비교하는 것,
최악의 경우 W(n) = n
최적의 경우 B(n) = 1
평균의 경우 는 뭘까 그러면?
주어진 키 x가 k번째에 있으면 k번을 비교해야 한다.
어떤 키 x가 리스트S에 골고루 분포해있다고 가정하면,
빅오(O):복잡도 함수의 점근적 상한 을 표기
오메가(Ω):복잡도 합수의 점근적 하한 을 표기
쎄타(Θ)=차수:복잡도 함수의 점근적 상한과 하한 을 동시에 만족
뭘까에요