Big O notation
func checkFirst(names: [String]) {
if let first = names.first {
print(first)
} else {
print("no names")
}
}
🌠출처 - raywenderlich - Data structures algorithms in swift v.4.0
func printNames(names: [String]) {
for name in names {
print(name)
}
}
for
loop의 반복 횟수가 증가한다.🌠출처 - raywenderlich - Data structures algorithms in swift v.4.0
🙋 두 개의 루프를 돌면서, 여섯개의 O(1)을 호출한다면, O(2n+6)?
👉 time complexity는 성능의 high-level shape를 말한다. 따라서 루프가 몇 개인지는 계산하지 않는다. 모든 상수는 Big O notation에서 삭제된다. O(2n+6)은 O(n)과 같다.
비록 이 책의 중심적인 관심사는 아니지만, 절대 효율을 위한 최적화는 중요할 수 있다. 기업들은 Big O notation이 무시하는 상수의 경사slope를 줄이기 위해 연구 개발에 수백만 달러를 쏟아부었다. 예를 들어 GPU에 최적화된 알고리즘(O(n))은 일반 CPU 버전 알고리즘(O(n) )보다 100배 더 빨리 실행될 수 있다. 비록 우리는 이런 종류의 최적화는 무시하겠지만, 이런 속도조절은 중요하다.
func printNames(names: [String]) {
for _ in names {
for name in names {
print(name)
}
}
}
🌠출처 - raywenderlich - Data structures algorithms in swift v.4.0
let numbers = [1, 3, 56, 66, 68, 80, 99, 105, 450]
func naiveContains(_ value: Int, in array: [Int]) -> Bool {
for element in array {
if element == value {
return true
}
}
return false
}
func naiveContains(_ value: Int, in array: [Int]) -> Bool {
// array가 비어있으면 false를 리턴하고 종료
guard !array.isEmpty else { return false }
let middleIndex = array.count / 2
if value <= array[middleIndex] {
for index in 0...middleIndex {
if array[index] == value {
return true
}
}
} else {
for index in middleIndex..<array.count {
if array[index] == value {
return true
}
}
}
return false
}
🌠출처 - raywenderlich - Data structures algorithms in swift v.4.0
🙋 로그 베이스 2 ? 10 ?
👉 로그 베이스는 2. 하지만 성능의 모양shape이 핵심이므로, 로그 베이스는 중요하지 않다.
sort
multiplication of linear
and logarithmic time
logarithmic
< quasilinear
< linear
🌠출처 - raywenderlich - Data structures algorithms in swift v.4.0
→ 작은 데이터 셋의 경우, 메모리 할당은 알고리즘에서 비교해야 하는 원소의 수보다 많은 비용이 들 수 있다.
func sumFromOne(upto n: Int) -> Int {
var result = 0
for i in 1...n {
result += i
}
return result
}
sumFromOne(upto: 10000)
func sumFromOne(upto n: Int) -> Int {
(1...n).reduce(0, +)
}
sumFromOne(upto: 10000)
func sumFromOne(upto n: Int) -> Int {
(n + 1) * n / 2
}
sumFromOne(upto: 10000)