-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathContents.swift
119 lines (86 loc) · 2.65 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import UIKit
//====================================================
// Lecture Video: https://youtu.be/b9AvLEFihFw
//====================================================
// Big O Notation: calculating the performanc of a given algorithm
// Big O has two performance metrics:
// 1. time complexity
// 2. space complexity
// fastest to slowest runtimes (time complexity)
// O(1), O(log n), O(n), O(n log n), O(n ^ 2), O(2 ^ n), O(n!)
//====================================================
// O(1) - constant time
//====================================================
func printFirstElement(arr: [String]) {
guard let first = arr.first else {
return
}
print(first)
}
printFirstElement(arr: ["Greg", "Matt"])
let fellows = ["Mel", "Yulia", "Stephanie"]
// what is the runtime of the line below?
fellows[2] // O(1)
let firstTwoFellows = fellows.prefix(10) // O(1)
print(firstTwoFellows)
let numbers: Set = [1, 2, 3, 4]
numbers.contains(3) // O(1)
//====================================================
// O(log n) - logorithmic time
// on every iteration the the problem increments
// or decrements by double the current value
//====================================================
let n = 16
var j = 1
while j < n {
j *= 2 // 2, 4, 8, 16
}
//====================================================
// O(n) - linear time
//====================================================
// n represents the number of elements in the collection
for fellow in fellows { // O(n) => O(3)
print(fellow)
}
var count = 0
while count < 10 {
print(count)
count += 1
}
//====================================================
// O(n log n), e.g .sorted(), mergeSort, quickSort
//====================================================
for _ in 0..<10 { // O(n) => 10
var j = 1
while j < n { // O(log n) => 4
j *= 2 // 2, 4, 8, 16
}
}
//====================================================
// O(n ^ 2) - quadratic
//====================================================
let list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in 0..<list.count { // O(n) => 10
for j in 0..<list.count { // O(n) => 10
print("\(list[i]) * \(list[j]) = \(list[i] * list[j])")
}
}
//====================================================
// deriving compound runtimes
//====================================================
func compoundRuntimes(arr: [Int]) {
for _ in 0..<1000 {
print("Hi!")
}
for num in arr {
print(num)
}
for (indexOne,numOne) in arr.enumerated() { // O(n)
for (indexTwo, numTwo) in arr.enumerated() { //O(n)
if indexOne != indexTwo && numOne == numTwo {
print("It's a match! \(numOne) and \(numTwo) are equal")
}
}
}
}
// solution: O(n ^ 2)