算法图解1 - 二分查找和大O表示法
Posted Android开发中文站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解1 - 二分查找和大O表示法相关的知识,希望对你有一定的参考价值。
闲来无事,翻了翻《算法图解》,觉得收获颇多,所以会陆续整理成笔记,纪录学习过程。嗯,第一篇先来看看二分查找和大O表示法吧。
一、二分查找
一般而言,对于包含 n 个元素的列表,用二分查找最多需要 log2 n 步,而简单查找最多需要 n 步。
/**
* @msg: 二分查找
* @param { Array} 数组
* @param { String} 数值
* @return: index
*/
const binarySearch = (arr, val) => {
let start = 0;
let end = arr.length - 1;
let guess;
while (start <= end) {
let mid = Math.ceil((start + end) / 2);
guess = arr[ mid];
if (guess === val) return mid;
if (guess > val) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return -1;
}
binarySearch([ 1, 3, 5, 7, 9], 3);
一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。
二、运行时间
我们举个例子来说:简单查找逐个地检查数字,如果列表包含 100 个数字,最多需要猜 100 次。如果列表包含 40 亿个数字,最多需要猜 40 亿次。
可以看出来,对比线性查找来说,二分查找效率出奇的高。
三、大O表示法
大O表示法:是一种特殊的表示法,指出了算法的速度有多快。。
需要注意:大O表示法计算的是操作数。
大O表示法说的是最糟的情形。
四、5种常见大O运行时间
-
对数时间:O (log n ),二分查找 -
线性时间:O (n ) ,简单查找 -
O (n * log n ),快速排序——一种速度较快的排序算法 -
O (n 2 ),选择排序——一种速度较慢的排序算法 -
O (n !),旅行商问题的解决方案——一种非常慢的算法
这就有意思了,通过上面的图示,我们得到几点启示
-
算法的速度指的并非时间,而是操作数的增速。 -
谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。 -
算法的运行时间用大O表示法表示。 -
O (log n ) 比 O (n ) 快,当需要搜索的元素越多时,前者比后者快得越多。
五、旅行商问题
5 个城市,有 5 种选择,去到一个城市之后,还有 4 种选择,以此类推:5 43 21 = 5! = 120
从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的 Hamilton 回路。
突然发现,算法的世界真的很大,而很多实际问题都是通过算法解决的。
以上是关于算法图解1 - 二分查找和大O表示法的主要内容,如果未能解决你的问题,请参考以下文章