时间复杂度
时间复杂度是衡量算法运行速度的指标。
常数阶 O(1)
不论算法代码有多少行,只要其中没有循环、递归,按前文所介绍计算方法,其时间复杂度都是Ο(1)。
func calculate(_ num1: Int, _ num2: Int) -> Int {let sum = num1 +num2return sum;
}
对数阶 O(㏒n)
以下边算法举例,其中变量i的值从1开始,每循环一次就乘以2,当其大于n时,循环结束。(常见算法:二分查找)
1 func calculate(_ num: Int) -> Int {
2 var i = 1
3 while i <= num {
4 i *= 2
5 }
6 return i
7 }
线性阶 O(n)
因为for循环中的代码会执行n遍,所以当n很大时候,执行时间跟n比较相关,忽略常数项、最高项系数,所以时间复杂度是O(n)。(常见算法:双指针接雨水)
func calculate(_ num: Int) -> Int {var sum = 0for i in 0..<num {sum += i}return sum
}
线性对数阶 O(n㏒n)
线性与对数的结合应用。
func calculate(_ num: Int) {var j = 0for i in 0..<num {while j <= num {j = i * 2}}
}
平方阶 O(n²)
两次循环, 如果内外层循环次数不一样,时间复杂度n∗m,内外层循环次数一样,时间复杂度是n∗n。 (常见算法:冒泡排序)
func calculate(_ num: Int) -> Int {var sum = 0for i in 0..<num {for j in 0..<num {sum += i + j}}return sum
}
复杂度比较
O(1) < O(㏒n) < O(n) < O(n㏒n) < O(n²)
空间复杂度
空间复杂度是衡量程序运行临时占用存储空间大小的指标。
常数阶 O(1)
func calculate(_ num: Int) {var sum = 0 // 常量sumfor i in 0..<num { // 常量isum += i}
}
线性阶 O(n)
func calculate(_ num: Int) {var nums = [Int]() 一维数组for i in 0..<num {num.append(i)}
}
平方阶 O(n²)
func calculate(_ num: Int) {var result = [[Int]]() // 二维数组for i in 0..<num {var nums = [Int]()for j in 0..<num {nums.append(i+j)}result.append(nums)}
}
复杂度比较
O(1) < O(n) < O(n²)