๐ก Big O ํ๊ธฐ๋ฒ
ํจ์์ ์ฆ๊ฐ ์ถ์ธ๋ฅผ ๋น๊ตํ๋ ์ ๊ทผ ํ๊ธฐ๋ฒ์์ ์ํ์ (์ต์ ์ ์ํฉ)์ ํํํ๋ ํ๊ธฐ๋ฒ์ด๋ค. computer science์์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๋น๊ตํ ๋ ์ฌ์ฉํฉ๋๋ค.
๐ก Time Complexity: ์๊ฐ๋ณต์ก๋
์ ๋ ฅ๋ N์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ๋๋ ์กฐ์์ ์๋ฅผ ๋ํ๋ธ๋ค.
Constant Time(์์ ์๊ฐ) - O(1)
func constantTime(_ n: Int) -> Int {
let result = n * n
return result
}
loop๊ฐ ์๊ณ ๋จ์ํ ๊ณ์ฐ๊ฒฐ๊ณผ๋ฅผ return ํ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
Linear Time(์ ํ ์๊ฐ) - O(n)
func linearTime(_ A: [Int]) -> Int {
for i in 0..<A.count {
if A[i] == 0 {
return 0
}
}
return 1
}
์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ด ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋ ๊ฐ์ ํฌ๊ธฐ์ ์์กดํฉ๋๋ค.
linear time์ ์ํ ์๊ฐ์ ๊ธธ์ด๊ฐ ์
๋ ฅ๊ฐ์ ํฌ๊ธฐ์ ์ ๋น๋กํฉ๋๋ค.
Logarithmic time(๋ก๊ทธ ์๊ฐ) - O(log n)
func logarithmicTime(_ N: Int) -> Int {
var n = N
var result = 0
while n > 1 {
n /= 2
result += 1
}
return result
}
BST(Binary Search Trees)๊ฐ์ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ๋ค ์ ๋๋ค. ๊ทธ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์๋ ๋ง๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋๋ค. ์ด ๋ฐ์ผ๋ก ๋๋๋๊ฒ์ด O(log n) ๋ก๊ทธ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
Quadratic Time(2์ฐจ ์๊ฐ) - O(n^2)
func quadratic(_ n: Int) -> Int {
var result = 0
for i in 0..<n {
for j in i..<n {
result += 1
print("\(i) \(j)")
}
}
return result
}
2์ค ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์์ ์ฃผ๋ก ๋ฐ์ํฉ๋๋ค. ์ ๋ต์ ์ป์ ์๋ ์์ง๋ง ์๋๊ฐ ๋๋ฆฝ๋๋ค.
๐ก Space Complexity(๊ณต๊ฐ ๋ณต์ก๋)
์๊ณ ๋ฆฌ์ฆ์ด ์คํ๋ ๋ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ํ๋ธ๋ค.
์ผ๋ฐ์ ์ผ๋ก Big O๋ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋งํฉ๋๋ค. ๊ณต๊ฐ ๋ณต์ก๋๋ ๋ณ์๊ฐ ์ผ๋ง๋ ์ ์ธ๋๋์ง ๊ทธ๋ฆฌ๊ณ ๋ณ์๋ค๊ณผ ๊ด๋ จ๋ cost์ ๊ด๋ จ์์ต๋๋ค.
๐ก Trading off space of time
๋ ๋ฐฐ์ด์ ๊ณตํต ์์๊ฐ ์๋์ง ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง๋ก ํํํ ์ ์์ต๋๋ค.
๊ณต๊ฐ๋ณต์ก๋ ๊ด์ ์์๋ ๋งค์ฐ ํจ๊ณผ์ ์ด์ง๋ง ์๊ฐ๋ณต์ก๋ O(n^2)์ผ๋ก ํฐํธ์ ๋๋ค.
// Naive brute force O(n^2)
func commonItemsBrute(_ A: [Int], _ B: [Int]) -> Bool {
for i in 0..<A.count {
for j in 0..<B.count {
if A[i] == B[j] {
return true
}
}
}
return false
}
commonItemsBrute([1, 2, 3], [4, 5, 6])
commonItemsBrute([1, 2, 3], [3, 5, 6])
space๋ฅผ ์ฌ์ฉํด์ Hash Map ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
// Convert to hash and lookup via other index
func commonItemsHash(_ A: [Int], _ B: [Int]) -> Bool {
// Still looping...but not nested - O(2n) vs O(n^2)
var hashA = [Int: Bool]()
for a in A { // O(n)
hashA[a] = true
}
// Now lookup in the hash to see if elements of B exist
for b in B {
if hashA[b] == true {
return true
}
}
return false
}
commonItemsHash([1, 2, 3], [4, 5, 6])
commonItemsHash([1, 2, 3], [3, 5, 6])
์์์์์ฒ๋ผ ์ ์ฅ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ์๋ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋๋ ค์ ํด๊ฒฐํ๊ณ ์ ์ฅ ๊ณต๊ฐ์ ํ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ฅ ๊ณต๊ฐ์ ์ฌ์ฉํด์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.