mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 04:06:51 +08:00
Merge pull request #2386 from enjoyqqq/master
0704.二分查找.md、关于时间复杂度,你不知道的都在这里!.md:修改错别字
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
<a href="https://programmercarl.com/other/xunlianying.html" target="_blank">
|
<a href="https://programmercarl.com/other/xunlianying.html" target="_blank">
|
||||||
<img src="../pics/训练营.png" width="1000"/>
|
<img src="../pics/训练营.png" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>
|
||||||
|
|
||||||
|
|
||||||
# 704. 二分查找
|
# 704. 二分查找
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
**时间复杂度是一个函数,它定性描述该算法的运行时间**。
|
**时间复杂度是一个函数,它定性描述该算法的运行时间**。
|
||||||
|
|
||||||
我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的答题时间。
|
我们在软件开发中,时间复杂度就是用来方便开发者估算出程序运行的大体时间。
|
||||||
|
|
||||||
那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。
|
那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。
|
||||||
|
|
||||||
@ -80,13 +80,13 @@ O(2*n^2 + 10*n)
|
|||||||
O(n^2 + n)
|
O(n^2 + n)
|
||||||
```
|
```
|
||||||
|
|
||||||
只保留保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为:
|
只保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为:
|
||||||
|
|
||||||
```
|
```
|
||||||
O(n^2)
|
O(n^2)
|
||||||
```
|
```
|
||||||
|
|
||||||
如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就别变成了:
|
如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就变成了:
|
||||||
|
|
||||||
```
|
```
|
||||||
O(n^2)
|
O(n^2)
|
||||||
@ -96,7 +96,7 @@ O(n^2)
|
|||||||
|
|
||||||
|
|
||||||
也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2),
|
也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2),
|
||||||
O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。
|
O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),3 × n^2省略掉常数项系数,最终时间复杂度也是O(n^2)。
|
||||||
|
|
||||||
## O(log n)中的log是以什么为底?
|
## O(log n)中的log是以什么为底?
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项
|
|||||||
|
|
||||||
接下来再想一下其他解题思路。
|
接下来再想一下其他解题思路。
|
||||||
|
|
||||||
先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。
|
先对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后再遍历一遍n个字符串,这样就找到两个相同的字符串了。
|
||||||
|
|
||||||
那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。
|
那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。
|
||||||
|
|
||||||
@ -139,13 +139,13 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项
|
|||||||
|
|
||||||
所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。
|
所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。
|
||||||
|
|
||||||
这就是我们通过分析两种算法的时间复杂度得来的。
|
这就是我们通过分析两种算法的时间复杂度得来的结论。
|
||||||
|
|
||||||
**当然这不是这道题目的最优解,我仅仅是用这道题目来讲解一下时间复杂度**。
|
**当然这不是这道题目的最优解,我仅仅是用这道题目来讲解一下时间复杂度**。
|
||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
本篇讲解了什么是时间复杂度,复杂度是用来干什么,以及数据规模对时间复杂度的影响。
|
本篇讲解了什么是时间复杂度,复杂度是用来干什么的,以及数据规模对时间复杂度的影响。
|
||||||
|
|
||||||
还讲解了被大多数同学忽略的大O的定义以及log究竟是以谁为底的问题。
|
还讲解了被大多数同学忽略的大O的定义以及log究竟是以谁为底的问题。
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user