1算法简介
1.1 引言
算法是一组完成任务的指令。任何代码片段都可以视为算法
1.2 二分查找
使用二分查找时,每次都排除一半的数字。对于包含n个元素的列表,使用二分查找最多需要log2N步,而简单查找最多需要n步.
查找方法 | 简单查找 | 二分查找 |
假设列表包含1024个元素,查找某个元素 | 最多查找1024次 | 最多查找8次。 log21024=8 |
1.2.2 运行时间
一般而言,应选择效率最高的算法,以最大限度的减少运行时间或占用空间。
线性时间:猜测的最多次数与列表长度相同。
对数时间:二分查找的运行时间为对数时间
假设列表包含1024个元素,查找某个元素
查找方法 | 查找次数 | 运行时间 |
简单查找 | 最多查找1024次 | 1024 |
二分查找 | 最多查找8次。 log21024=8 | 8 |
1.3 大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。
大O表示法指出了最糟情况下的运行时间。
1.3.1 算法的运行时间以不同的速度增加
假设查找一个元素用时1毫秒,查看不同长度的数组使用简单查找和二分查找运行时间
查找方法 | 100个元素 | 1万个元素(与100相比) | 1千万个元素(与100相比) | 10亿个元素(与100相比) |
简单查找 | 100毫秒 | 10000毫秒(100倍) | 1000万毫秒(10万倍) | 10亿毫秒(1000万倍) |
二分查找 | 7 | 14(用时2倍) | 24(用时3倍多) | 30(用时4倍多) |
1.3.2 理解不同的大O运行时间
在一张纸上绘制16个格子。
方法1:1次画一个格子,需要16步。运行时间O(n)
方法2:将纸横向对折,再对折;摊平,纵向对折,再对折,需要4步,运行时间O(log2n)
1.3.3 一些常见的大O运行时间
从快到慢的顺序列出了经常会遇到的5种大O运行时间
- O(log n):对数时间,这样的算法包括二分查找
- O(n):线性时间,这样的算法包括简单查找
- O(n*long n):这样的算法包括快速排序——一种速度较快的排序算法
- O(n2):这样的算法包括选择排序——一种速度较慢的排序算法
- O(n!):这样的算法包括旅行商问题的解决方案——一种非常慢的算法
启示:
- 算法的速度指的并非时间,而是操作数的增速
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
- 算法的运行时间用大O表示发表示
- o(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多
1.3.4 旅行商
有一位旅行商,他需要前往5个城市,同时确保旅程最短。
对于每种顺序,他都计算总旅程,在挑选出旅程最短的路线。
- 5个城市有120种不同的排列方式。
- 6个城市有720种不同的排列方式。
- 7个城市有5040种不同的排列方式。
推而广之,设计n个城市时,需要执行n!(n的阶乘)次操作才能计算出结果。因此运行时间为O(n!),即阶乘时间。这是计算机科学领域待解决的问题,对于这个问题,目前还没有找到更快的算法。
1.4 小结
- 二分查找的速度比简单查找快得多。
- o(log n)比O(n)快。需要搜索的元素越多,前者比后者就快的越多。
- 算法运行时间并不以秒为单位。
- 算法运行时间是从其增速的角度度量的。
- 算法运行时间用大O表示法表示。