2021. 9. 8. 08:00γμ½λ© ν μ€νΈ μ€λΉ
μλ νμΈμ? μ£Όλνλ μ λλ€.
μ€λμ μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦μ κ³΅κ° λ³΅μ‘λμ λν΄ κ³΅λΆ ν΄ λ³΄λλ‘ νλ κ²μ΄μμ.
μμ€ μ½λμ λν΄μ νμΈ νκ³ μΆμΌμ λΆλ€κ»μλ μ£Όλνλμ Git hubμ κ΄μ¬μ μ£ΌμΈμ!
π κ³΅κ° λ³΅μ‘λ (Space Comploexity)
μκ³ λ¦¬μ¦μμ κ³μ° 볡μ‘λλ₯Ό κ³μ°ν λ λ κ°μ§λ₯Ό κ³ λ €νλ κ²μ΄μμ.
- μκ° λ³΅μ‘λ: μΌλ§λ λΉ λ₯΄κ² μ€νλλκ°?
- κ³΅κ° λ³΅μ‘λ: μΌλ§λ μ μ μ μ₯ κ³΅κ° μ©λμ μ¬μ©νλκ°?
κ·Έλ κΈ° λλ¬Έμ μ’μ μκ³ λ¦¬μ¦μ΄λ? μ€ν μκ°λ μ§§κ³ , μ μ₯ 곡κ°λ μ κ² μ¬μ©νλ κ²μ΄κ² μ§μ?
νμ§λ§, λ λ€ λ§μ‘± μν€κΈ΄ μ΄λ €μ΄ κ²μ΄μμ.
μλνλ©΄? μκ°κ³Ό 곡κ°μ μμ νμ§λ μμ§λ§, λ° λΉλ‘μ μ±ν₯μ κ°μ§κ³ μκΈ° λλ¬Έμ΄λλλ€.
νμ§λ§ μ΅κ·Όμλ λμ©λ Systemμ΄ λ³΄νΈνλλ©΄μ κ³΅κ° λ³΅μ‘λ 보λ€λ μκ° λ³΅μ‘λλ₯Ό μ°μ νλ κ²½ν₯μ΄ μλ κ²μ΄μμ.
λ€λ§, Big Dataμ κ°μ΄ κ³ μ©λμ λ€λ£¨λ μ κ³μμλ λΉμ°ν κ³΅κ° λ³΅μ‘λλ κ³ λ € νλ€λ κ² μμ§ λ§μΈμ!
κ²°κ΅ μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λκ° μ€μνλ€κ³ μ 리ν μ μκ² λ€μ!
π κ³΅κ° λ³΅μ‘λλ λλ΅μ μΈ κ³μ°μ΄ νμνλ΅λλ€.
μμ μ λ§λ€μ΄μ‘λ κ³΅κ° λ³΅μ‘λμ κ΄ν κ³ λ € μ¬ν λ¬Έμ λ€μ΄ κΈ°μ‘΄ μκ³ λ¦¬μ¦ λ¬Έμ μ λ§μ΄ λ Ήμ μλ κ²μ΄μμ.
κ·Έλ κΈ° λλ¬Έμ κΈ°μ‘΄ μκ³ λ¦¬μ¦ λ¬Έμ μ μκ° λ³΅μ‘λ λΏλ§ μλλΌ, κ³΅κ° λ³΅μ‘λ μ μ½ μ¬νμ΄ λ¬Έμ λ‘ λμ€λ κ²½μ°κ° λ§λ€κ³ ν©λλ€.
λν, κΈ°μ‘΄ μκ³ λ¦¬μ¦ λ¬Έμ μ μν₯μ λ°μΌμ μμ μ μ·¨μ ν μ λ°° κ°λ°μ λΆλ€μ΄ λ©΄μ μμ κ³΅κ° λ³΅μ‘λμ λν΄ λ¬»λ κ²½μ°λ κ½€ μλ€κ³ ν΄μ!
π μμΈν μμ보기
Programμ μ€ν λ° μλ£νλλ°, νμν μ μ₯곡κ°μ μμ λ°λ‘ κ³΅κ° λ³΅μ‘λλ‘ κ³μ°νλ κ²μ΄μμ.
μ΄ νμ μ μ₯ 곡κ°μ μ΄λ»κ² κ³μ°ν κΉμ?
- κ³ μ κ³΅κ° (μκ³ λ¦¬μ¦κ³Ό 무κ΄ν 곡κ°) : Code μ μ₯ 곡κ°, λ¨μ λ³μ λ° μμκ° μ¬μ©
- κ°λ³ κ³΅κ° (μκ³ λ¦¬μ¦ μ€νκ³Ό κ΄λ ¨ν 곡κ°) : μ€ν μ€ λμ μΌλ‘ νμν 곡κ°
- $ S(P) = c + S_p(n) $
- μ¬κΈ°μ c = κ³ μ 곡κ°
- μ¬κΈ°μ $ S_p(n) $ = κ°λ³ 곡κ°μ λνλ
π κ³΅κ° λ³΅μ‘λ κ³μ°λ²μ 무μμΌκΉμ?
κ³΅κ° λ³΅μ‘λ κ³μ°μ μκ³ λ¦¬μ¦μμ μ€μ μ¬μ©λλ μ μ₯ 곡κ°μ κ³μ°νλ©΄ λλ κ²μ΄μμ.
μ΄λ₯Ό Big O νκΈ°λ²μΌλ‘ ννν μ μλ€λ©΄ λλ΅λλ€!
π κ³΅κ° λ³΅μ‘λ μμ 1
n! (Factorial) ꡬνκΈ°
곡μ : n! = 1 x 2 x 3 x ... x n
nμ κ°μ μκ΄μμ΄ λ³μ n, λ³μ fac, λ³μ indexμ κ°μ΄ μΈ κ°μ λ³μλ§ νμν κ²μ΄μμ.
κ²°κ΅ λ³μκ° κ°κ° νλμ© νμν κ²μ΄λκΉ κ³΅κ° λ³΅μ‘λλ O(1)μ΄ λλλ°, μ΄λ μ€μ μκ³ λ¦¬μ¦ μ€ν μ μ¬μ©λλ μ μ₯ 곡κ°μ κ³μ°νλ©΄ λλ κ²μ΄μμ.
def factorial(data):
fac_num = 1
round_num = 0
start_factorial_time = time.time()
for index in range(2, data + 1):
fac_num = fac_num * index
round_num += 1
print(str(round_num) + "λ²μ§Έ factorial κ°μ \"" + str(fac_num) + "\" μ
λλ€.")
print("Factorial κ³μ° κ° κ±Έλ¦° μκ°μ " + str(time.time() - start_factorial_time) + "μ΄ μ
λλ€.")
print("\n")
return fac_num
print(factorial(3))
# κ²°κ³Ό 6
π κ³΅κ° λ³΅μ‘λ μμ 2
n! (Factorial) ꡬνκΈ°
곡μ : n! = 1 x 2 x 3 x ... x n
μ΄λ²μλ μ¬κ·ν¨μλ₯Ό μ¬μ©ν΄ λ³Ό κ²μ΄μμ. nμ λ°λΌ, λ³μ nμ΄ nκ°κ° λ§λ€μ΄μ§λ κ²μ΄μμ.
Factorial Functionμ μ¬κ· ν¨μλ‘ 1κΉμ§ νΈμΆνμμ λ, n λΆν° 1κΉμ§ Stackμ μμ΄κ² λλ΅λλ€.
κ²°κ΅ κ³΅κ° λ³΅μ‘λλ O(n)μ΄ λκ² λ€μ!
def factorial_recursion(data):
if data > 1:
a = data * factorial_recursion(data - 1)
return a
else:
return 1
Complexity:
expected worst-case time complexity : O(N)
expected worst-case space complexity: O(N)
π μ¬κ· μ©λ²(Recursive call, μ¬κ· νΈμΆ)
κ³ κΈ μ λ ¬ μκ³ λ¦¬μ¦μμλ μ¬κ· μ©λ²μ λ§μ΄ μ¬μ©νλ κ²μ΄μμ.
κ·Έλμ κ³ λ¦ μ λ ¬ μκ³ λ¦¬μ¦μ 곡λΆνκΈ° μ μ μ£Όλνλμ μ¬κ· μ©λ²μ 곡λΆνκΈ°λ‘ ν©λλ€!
μ¬κ· μ©λ²μ ν¨μ μμμ λμΌν ν¨μ(μκΈ° μμ )μ νΈμΆνλ ννμΈ κ²μ΄μμ.
μ¬λ¬ μκ³ λ¦¬μ¦ μμ± μμ μ¬μ©λκΈ° λλ¬Έμ μ΅μν΄μ ΈμΌ νλ€κ³ ν©λλ€!
π μμ
- Factorialμ ꡬνλ μκ³ λ¦¬μ¦μ Recursive Callμ μ΄μ©νμ¬ νμ΄λ³΄μ!
π μμ λΆμ
- κ°λ¨ν κ²λΆν° μκ°νκΈ°
- 2! = 1 X 2
- 3! = 1 X 2 X 3
- 4! = 1 X 2 X 3 X 4
- λ°λ³΅λλ κ·μΉ μκ° ν΄ λ³΄κΈ° :
- n! = n X (n -1)!
μλ₯Ό λ€μ΄ 4λΌλ©΄ 4 = 4 X 3! μ¦, μκΈ° μμ μμ 1 λΊ κ°λ€μ κ³±νλ κ·μΉμ΄ 보μΈλ€. - ν¨μ λ§λ€κΈ°
- ν¨μ(n)μ n > 1 μ΄λ©΄ return n X ν¨μ(n -1)
- ν¨μ(n)μ n = 1 μ΄λ©΄ return n
- n! = n X (n -1)!
- κ²μ¦ (μ½λλ‘ λΆν° κ²μ¦νμ§ μκ³ , μ§μ κ°λ¨ν κ²½μ°λΆν° λμ
ν΄μ κ²μ¦ν΄μΌ νλ κ²!)
- 2! κ²μ¦νκΈ°!
- ν¨μ(2) μ΄λ©΄, 2 > 1μ΄κΈ° λλ¬Έμ 2 X ν¨μ(1)
- ν¨μ(1)μ 1κ³Ό κ°κΈ° λλ¬Έμ 쑰건문μ λ§μ§ μλλ€ κ²°κ΅ return nμ΄ λλ©΄μ λ°νμ΄ μ΄λ€μ§ κ²μ΄κ³ , μ΄λ΄ κ²½μ° return 2 X 1 = 2κ° λλ€.
- 3! κ²μ¦νκΈ°!
- ν¨μ(3) μ΄λ©΄, 3 > 1μ΄κΈ° λλ¬Έμ 3 X ν¨μ(2)
- ν¨μ(2)λ κ²°κ΅ 1λ²μ μν΄ 2! μ΄λ―λ‘, return 2 X 1 =2
- 3 X ν¨μ(2) = 3 X 2 = 3 X 2 X 1 = 6μ΄ λλ€.
- 4! κ²μ¦νκΈ°!
- ν¨μ(4)μ΄λ©΄, 4 > 1μ΄κΈ° λλ¬Έμ 4 X ν¨μ(3)
- ν¨μ(3)μ 2λ²μ μν΄ 3 X 2 X 1 = 6μ΄ λλ€.
- 4 X ν¨μ(3) = 4 X 6 = 24κ° λλ€.
- 2! κ²μ¦νκΈ°!
π Python
def factorial(n):
if n > 1:
return n * factorial(n - 1)
else:
return n
for num in range(10):
print(factorial(num))
# κ²°κ³Ό : 0
# 1
# 2
# 6
# 24
# 120
# 720
# 5040
# 40320
# 362880
π μκ° λ³΅μ‘λμ κ³΅κ° λ³΅μ‘λ
factorial(n)μ n - 1λ²μ factorial()μ νΈμΆνμ¬ κ³±μ μ νλ κ²μ΄μμ.
μΌμ’ μ n - 1λ² λ°λ³΅λ¬Έμ λ리λ κ²κ³Ό κ°λ€κ³ λ³Ό μ μκ² λ€μ!!
factorial() ν¨μλ₯Ό νΈμΆν λλ§λ€, μ§μλ³μ nμ΄ μκΈ°λ κ²μ΄μμ.
κ²°κ΅ μκ° λ³΅μ‘λ / κ³΅κ° λ³΅μ‘λλ O(n - 1)μ΄ λλλ°, Big O νκΈ°λ²μμλ λ€μ λΆλΆμ μλΌλ²λ¦¬κ² λλ¬Έμ O(n)μ΄ λλ κ²μ΄λλλ€!
π μ¬κ· νΈμΆμ μΌλ°μ μΈ νν
# μΌλ°μ μΈ νν1
def function(μ
λ ₯):
if μ
λ ₯ > μΌμ κ°: # μ
λ ₯μ΄ μΌμ κ° μ΄μμ΄λ©΄
return function(μ
λ ₯ - 1) # μ
λ ₯λ³΄λ€ μμ κ°
else:
return μΌμ κ°, μ
λ ₯κ°, λλ νΉμ κ° # μ¬κ· νΈμΆ μ’
λ£
# μΌλ°μ μΈ νν2
def function(μ
λ ₯):
if μ
λ ₯ <= μΌμ κ°: # μ
λ ₯μ΄ μΌμ κ°λ³΄λ€ μμΌλ©΄
return μΌμ κ°, μ
λ ₯κ°, λλ νΉμ κ° # μ¬κ· νΈμΆ μ’
λ£
function(μ
λ ₯λ³΄λ€ μμ κ°)
return κ²°κ³Όκ°
def factorial_reverse(n):
if n <= 1:
return n
else:
return n * factorial_reverse(n - 1)
for num in range(10):
print(factorial_reverse(num))
# κ²°κ³Ό : 0
# 1
# 2
# 6
# 24
# 120
# 720
# 5040
# 40320
# 362880
π μ¬κ· νΈμΆκ΄λ ¨ Stack
ν¨μλ λ΄λΆμ μΌλ‘ Stackμ²λΌ κ΄λ¦¬ λ©λλ€!
μ¬κ· νΈμΆμ λν΄ μ μ΄ν΄κ° λμ§ μλλ€λ©΄ μ΄ κ³³μ μ°Έκ³ ν΄ λ³΄λκ±Έ μΆμ² λ리λ κ²μ΄μμ!
μ°Έκ³ λ‘ νμ΄μ¬μ λ΄λΆμ μΌλ‘ Stackμ 1000ν κΉμ§ Limitμ κ±Έμ΄ λμ κ²μ΄μμ. κ·Έλ κΈ° λλ¬Έμ λ°°κ· ν¨μ κΉμ΄(νλ²μ νΈμΆλλ νμ)κ° 1000ν μ΄νμ¬μΌ νκ³ , μ΄ μ΄μμ λμΌλ©΄ Errorκ° λλ€κ³ ν©λλ€!
μ£Όλνλμ κΈμ΄ λ§μμ λμ ¨λμ? ꡬλ κ³Ό 곡κ°! κ·Έλ¦¬κ³ , λκΈμ μ£Όλνλμκ² λ§μ νμ΄ λ©λλ€
'μ½λ© ν μ€νΈ μ€λΉ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°&μκ³ λ¦¬μ¦] μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦μ΄λ? (0) | 2021.08.07 |
---|