forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.7 KiB
81 lines
1.7 KiB
3 years ago
|
# 算法运行效率与时间复杂度
|
||
|
|
||
|
* **时间复杂度**
|
||
|
|
||
|
> 使用表示算法运行的快慢 和 循环次数
|
||
|
|
||
|
|
||
|
|
||
|
> 1、时间复杂度=o(1)
|
||
|
```java
|
||
|
print('Hello World!')
|
||
|
```
|
||
|
|
||
|
> 2、时间复杂度=o(n)
|
||
|
```java
|
||
|
for(int i = 0; i < n; i++){
|
||
|
print('Hello World!')
|
||
|
}
|
||
|
```
|
||
|
|
||
|
> 3、时间复杂度=o(n*m)
|
||
|
```java
|
||
|
for(int i = 0; i < n; i++){
|
||
|
for(int j = 0; j < m; j++){
|
||
|
print('Hello World!')
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
> **注意区分**
|
||
|
>
|
||
|
> 理解:**问题规模**
|
||
|
>
|
||
|
> 4、时间复杂度=o(1)
|
||
|
```java
|
||
|
print('Hello World!')
|
||
|
print('Hello Java!')
|
||
|
print('Hello Zhang!')
|
||
|
```
|
||
|
|
||
|
> 5、时间复杂度=o(n<sup>2</sup>)
|
||
|
```java
|
||
|
for(int i = 0; i < n; i++){
|
||
|
print('Hello Java!')
|
||
|
for(int j = 0; j < m; j++){
|
||
|
print('Hello World!')
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
> 5、时间复杂度=o(log<sub>2</sub> n) 或者 o(log n)
|
||
|
```java
|
||
|
while(n>1){
|
||
|
print('Hello World!')
|
||
|
n = n / 2
|
||
|
}
|
||
|
```
|
||
|
|
||
|
> 当n=64, 则输出为64、32、16、8、4、2
|
||
|
>
|
||
|
> 由于2<sup>6</sup>=64,则log<sub>2 </sub>64=6。
|
||
|
>
|
||
|
> 以此类推:`n = n / 3` 为 o(log<sub>3</sub> n)
|
||
|
>
|
||
|
> 以此类推:`n = n / 4` 为 o(log<sub>4</sub> n)
|
||
|
>
|
||
|
> **总结**:只要问题规模出现**循环减半**情况,则使用**对数**描述时间复杂度;
|
||
|
>
|
||
|
> 只要问题规模出现**多层循环**情况,则使用**次幂**描述时间复杂的。
|
||
|
|
||
|
---------
|
||
|
|
||
|
* **小结**
|
||
|
|
||
|
> 时间复杂度是用来描述估计算法运行时间的一个式子(单位)。
|
||
|
>
|
||
|
> **一般来说**,时间复杂度高的算法比复杂度低的算法慢。
|
||
|
>
|
||
|
> 常见的时间复杂度排序(按效率排序 【主要:o(1) < o(log n) < o(n) 】)
|
||
|
>
|
||
|
> o(1) < o(log n) < o(n) < o(n * log n) < o(n<sup>2</sup>) < o(n<sup>2</sup> * log n) < o(n<sup>3</sup>)
|