本章讲解:
最好情况时间复杂度: 代码在最理想情况下执行的时间复杂度
最坏情况时间复杂度: 代码在最坏情况下执行的时间复杂度
平均情况时间复杂度: 代码在所有情况下执行的次数的加权平均值
均摊时间复杂度: 代码在执行的所有复杂度情况中绝大部分是低级别的复杂度,
个别情况是高级别复杂度且发生具有时序关系时,可以将这个高级别
复杂度均摊到低级别复杂度上,基本上均摊结果就等于低级别复杂度
最好、最坏情况时间复杂度
示例代码:
func find(array []int, n, x int) (pos int) {
pos = -1
for i:=0; i<n; i++ {
if array[i] == x {
pos = i
break
}
}
return pos
}
func main() {
a := []int{1,2,3,4,5}
fmt.Println(find(a, len(a), 2))
}
最好情况时间复杂度为O(1)
最坏情况时间复杂度为O(n)
这段代码的加权平均时间复杂度仍然是 O(n)
均摊时间复杂度
示例代码:
func insert(val int) {
var array = [5]int{}
var count = 0
if count == len(array) {
var sum = 0
for i:=0; i< len(array); i++ {
sum += array[i]
}
array[0] = sum
count = 1
}
array[count] = val
count ++
}
最好情况时间复杂度为O(1)
最坏情况时间复杂度为O(n)
那平均时间复杂度是多少? 答案是O(1)
为什么要引入这4个概念?
1、同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面、更准确的描述代码的时间复杂度。
2、代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度,大多数情况不需要。
如何分析平均、均摊时间复杂度?
1、平均时间复杂度
代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示
2、均摊时间复杂度
两个条件满足时使用:
1、代码在绝大多数情况下是低阶别复杂度,只有在极少情况下是高级别复杂度
2、低级别和高阶别复杂度出现具有时序规律,均摊结果一般都等于低阶别复杂度