算法图解 - 第1章 二分查找 与大O
例子:猜一个1到100之间的数,最多猜几次?
# 最糟糕的猜法:一个一个的猜
- 最多查找次数: n
- 运行时间: O(n)
# 二分查找:在有序的一组数中猜一个数,对半猜。找到返回其位置(索引),否则返回null
- 最多查找次数: log₂n
- 运行时间:O(logn)
eg:从1到100找一个数,最多查找 log₂100次。 2的7次方大于等于128,所以最多查找7次
# 理解:每次从中间找
代码:
/** * @method: test * @des: 二分查找 - 在有序的一组数中猜一个数,对半猜 * @param {list} - 一组数 * @param {item} - 要猜的数 * @return: */ function test(list, item) { var low = 0; var high = ''; var mid = '';//中间数 ---找到后的索引 var guess = ''; if (Object.prototype.toString.call(list) == "[object Array]") { high = list.length - 1; } while (low <= high) { mid = Math.floor((low + high)/2); guess = list[mid]; if (guess == item) {//找到了数 console.log('找到',mid); } if (guess > item) {//猜的数大了 high = mid - 1; console.log('大了',high); } else { low = mid + 1; console.log('小了',low);//猜的数小了 } console.log('none'); } } var o_list = [1,3,5,7,9,11]; test(o_list,7);
# 大O运行时间
- O(n) 线性时间
- O(logn) 对数时间 - 二分查找
- O(n*logn) 速度较快 - 快速排序
- O(n²) 速度较慢 -选择排序
- O(n!) 非常慢 - 旅行商问题
一步一叩首,今天的自己比昨天好一点就行,明天的自己需追寻