λ€λ₯Έ κ°λ°μλ€κ³Ό ν¨κ» μκ³ λ¦¬μ¦μ λν μλ
Όμ νκ² λλ©΄, μμ°μ€λ½κ² βμκ° λ³΅μ‘λβ μ΄μΌκΈ°κ° λμ¬ μλ°μ μμ΅λλ€. μκ° λ³΅μ‘λλ₯Ό κ³μ°ν μ€ μμμΌ μνν λνκ° μ΄λ£¨μ΄μ§ μ μκ² μ£ .
λ€νν, μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ λκ° μ΄ μ€ νλμ
λλ€.
β’
O(1)
β’
O(lgn)
β’
O(n)
β’
O(nlgn)
β’
O(n^2)
β’
O(n^3)
β’
O(n^4)
β’
O(2^n)
β’
O(n!)
μ΄ μ€μμλ O(1), O(lgn), O(n), O(nlgn), O(n^2), O(n^3) μ λκ° λ§μ΄ μ¬μ©λκ³ , λλ¨Έμ§λ νμΉ μμ΅λλ€.
O(1)
O(1)O(1)μ μΈνμ ν¬κΈ°κ° μμ μκ°μ μν₯μ΄ μλ€λ λ»μ
λλ€.
# O(1) ν¨μdef print_first(my_list):
print(my_list[0])
print_first([2, 3])
print_first([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53])
Plain Text
볡μ¬
print_first ν¨μλ₯Ό μ²μ νΈμΆν λλ μμκ° 2κ°λ°μ μλ 리μ€νΈλ₯Ό λ겨쀬λλ°, λ λ²μ§Έ νΈμΆν λλ μμκ° 16κ° μλ 리μ€νΈλ₯Ό λ겨쀬μ΅λλ€. κ·Έλ°λ° μ¬μ€ λ κ²½μ° κ±Έλ¦¬λ μκ°μ κ±°μ λκ°μ΅λλ€. μ΄μ°¨νΌ 맨 μμ μλ μμλ₯Ό λ°μμ€λ κ² λΏμ΄λκΉ, 리μ€νΈμ κΈΈμ΄λ μκ΄μ΄ μλ κ±°μ£ . κΈΈμ΄κ° 10λ§μ©μ΄λ λλ 리μ€νΈλ₯Ό λ겨μ€λ λκ°μ κ²μ
λλ€.
λλ¦μ νμ λ리μλ©΄, λ°λ³΅λ¬Έμ΄ μμΌλ©΄ λμ²΄λ‘ O(1)O(1)μ
λλ€.
O(n)
Case 1
# O(n) ν¨μdef print_each(my_list):
for i in range(len(my_list)):
print(my_list[i])
Plain Text
볡μ¬
λ°λ³΅λ¬Έμ΄ μκ³ , λ°λ³΅λλ νμκ° μΈνμ ν¬κΈ°μ λΉλ‘νλ©΄ μΌλ°μ μΌλ‘ O(n)O(n)μ
λλ€.
Case 2
# O(n) ν¨μdef print_half(my_list):
for i in range(len(my_list) // 2):
print(my_list[i])
Plain Text
볡μ¬
nnλ² λ°λ³΅νλ κ² μλλΌ n/2n/2λ² λ°λ³΅νλ€λ©΄ μκ° λ³΅μ‘λκ° μ΄λ»κ² λ κΉμ? O(\frac{1}{2}n)O(21n)μ΄μ§λ§, \frac{1}{2}21μ λ²λ €μ κ²°λ‘ μ μΌλ‘λ O(n)O(n)μ΄λΌκ³ ν μ μμ΅λλ€.
Case 3
# O(n) ν¨μdef print_three_times(my_list):
for i in range(len(my_list)):
print(my_list[i])
for i in range(len(my_list)):
print(my_list[i])
for i in range(len(my_list)):
print(my_list[i])
Plain Text
볡μ¬
μ μ½λμ κ²½μ° O(3n)O(3n)μΈλ°, κ²°κ΅μλ 33μ λ²λ €μ μ΄κ² λν O(n)O(n)μ΄λΌκ³ ν μ μκ² μ£ ?
O(n^2)
κ·Έλ°λ° λ°λ³΅λ¬Έμ΄ μ°μν΄μ λμ€λ κ² μλλΌ, λ°λ³΅λ¬Έ μμ λ°λ³΅λ¬Έμ΄ μλ κ²½μ°κ° μμ΅λλ€.
# O(n^2) ν¨μdef print_pairs(my_list):
for i in range(len(my_list)):
for j in range(len(my_list)):
print(my_list[i], my_list[j])
Plain Text
볡μ¬
μ§κΈμ²λΌ λ λ°λ³΅λ¬Έ λ€ μΈνμ ν¬κΈ°μ λΉλ‘νλ κ²½μ°, O(n^2)O(n2)μ΄λΌκ³ ν μ μμ΅λλ€.
O(n^3)
# O(n^3) ν¨μdef print_triplets(my_list):
for i in range(len(my_list)):
for j in range(len(my_list)):
for k in range(len(my_list)):
print(my_list[i], my_list[j], my_list[k])
Plain Text
볡μ¬
λμΌν μ리λ‘, μΈνμ ν¬κΈ°μ λΉλ‘νλ λ°λ³΅λ¬Έμ΄ μΈ λ² μ€μ²©λλ©΄ O(n^3)O(n3)μ΄ λκ² μ£ ?
O(lgn)
Case 1
# O(lg n) ν¨μ# 2μ κ±°λμ κ³±μ μΆλ ₯νλ ν¨μ# (μ΄λ²μλ μΈνμ΄ λ¦¬μ€νΈκ° μλλΌ κ·Έλ₯ μ μμ
λλ€)def print_powers_of_two(n):
i = 1
while i < n:
print(i)
i = i * 2
Plain Text
볡μ¬
μ΄λ²μλ λ°λ³΅λ¬Έμ΄ μ‘°κΈ νΉμ΄ν©λλ€. iκ° λ λ°°μ© μ¦κ°νλ€μ.
μΈν nμ΄ 128μ΄λ©΄ λ°λ³΅λ¬Έμ΄ μ΄ λͺ λ² μ€νλ κΉμ? iκ° 1μΌ λλΆν° 2, 4, 8, 16, 32, 64κΉμ§ μ΄ 7λ² μ€νλ©λλ€. \lg{128}lg128λ 77μΈ κ±΄ μ°μ°μ΄ μλλλ€!
print_powers_of_two ν¨μλ O(\lg{n})O(lgn)μ
λλ€.
Case 2
# O(lg n) ν¨μ# 2μ κ±°λμ κ³±μ μΆλ ₯νλ ν¨μ# (μ΄λ²μλ μΈνμ΄ λ¦¬μ€νΈκ° μλλΌ κ·Έλ₯ μ μμ
λλ€)def print_powers_of_two(n):
i = n
while i > 1:
print(i)
i = i / 2
Plain Text
볡μ¬
iλ₯Ό 1λΆν° μμν΄μ λ λ°°μ© κ³±νλ κ² μλλΌ, nλΆν° μμν΄μ λ°μ© λλ λ΄
μλ€. μ΄ κ²½μ°μλ iκ° 128μΌ λλΆν° 64, 32, 16, 8, 4, 2κΉμ§ λ°λ³΅λ¬Έμ΄ 7λ² μ€νλ©λλ€.
λ κ²½μ° λͺ¨λ O(\lg{n})O(lgn)μ
λλ€.
O(nlgn)
O(n^2)O(n2)μ O(n)O(n)κ³Ό O(n)O(n)μ΄ μ€μ²©λ κ±°μ£ ? κ°μ λ
Όλ¦¬λ‘, O(n\lg{n})O(nlgn)μ O(n)O(n)κ³Ό O(\lg{n})O(lgn)μ΄ κ²Ήμ³μ§ κ²μ
λλ€.
Case 1
def print_powers_of_two_repeatedly(n):
for i in range(n): # λ°λ³΅νμ: nμ λΉλ‘
j = 1
while j < n: # λ°λ³΅νμ: lg nμ λΉλ‘
print(i, j)
j = j * 2
Plain Text
볡μ¬
μ μ½λμμ forλ¬Έμ λ°λ³΅νμλ nnμ λΉλ‘νλλ°, whileλ¬Έμ λ°λ³΅νμλ \lg{n}lgnμ λΉλ‘ν©λλ€. whileλ¬Έμ΄ forλ¬Έ μμ μ€μ²©λμ΄ μκΈ° λλ¬Έμ μ μ½λμ μκ° λ³΅μ‘λλ O(n\lg{n})O(nlgn)μ΄λΌκ³ ν μ μμ΅λλ€.
Case 2
def print_powers_of_two_repeatedly(n):
i = 1
while i < n: # λ°λ³΅νμ: lg nμ λΉλ‘for j in range(n): # λ°λ³΅νμ: nμ λΉλ‘
print(i, j)
i = i * 2
Plain Text
볡μ¬
Case 1μ μ½λλ₯Ό μ΄μ§ λ°κΏμ μ΄μ forλ¬Έμ΄ whileλ¬Έ μμ μ€μ²©λμ΄ μμ΅λλ€. μ΄ κ²½μ°μλ μκ° λ³΅μ‘λλ O(n\lg{n})O(nlgn)μ
λλ€.