内容简介:二分查找(英语:binary search),也称适合的场景:时间复杂度:
二分查找(英语:binary search),也称 折半搜索 (英语:half-interval search) 对数搜索 (英语:logarithmic search,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
适合的场景:
- Sorted(单调递增或者递减)
- Bounded (存在上下界,因为要一分为二的进行查找)
- Accessible by index(能够通过索引访问)
时间复杂度:
- O(logN)
空间复杂度:
- O(N) 使用常数空间,无论任何大小的输入数据,算法使用的空间都是一样的
适用的数据结构:
数组,因为在内存中时连续的适合使用二分查找。但是链表不适合,因为链表坐标不是固定的,访问a[2]需要先从a[0]的后继节点找到a[1]再通过a[1]的后继节点才能访问到a[2]。
步骤:
- 初始状态left、right 分别指向数组的头和尾。
- 通过(left + right) /2 得到中间位置mid,访问数组中mid位置的元素。
- 判断其与查找目标的大小关系,相等则程序返回,
- 比目标小则挪动left指针到mid + 1;比目标大则挪动right指针到mid - 1
- 重复上面步骤2 ~ 3直到找到目标元素或者程序退出。
代码实现:
<?php
$list = [1, 2, 5, 6, 8, 9, 12, 15, 23, 32, 56, 67, 73, 85];
function bioSearch($list, $target)
{
$left = 0;
$right = count($list) - 1;
while ($left <= $right) {
$mid = ($left + $right) / 2;
if ($list[$mid] == $target) {
return true;
} else if ($list[$mid] < $target) {
$left = $mid + 1;
continue;
} else {
$right = $mid - 1;
continue;
}
}
return false;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Julia 工程实践速记
- 【小坑速记】JDK加解密Key长度限制
- 您真的记住了吗?游戏知识速记卡・第二期
- Python 在线文档系统 MrDoc,发布 Windows 免安装一键体验包和浏览器速记扩展
- LeetCode 81,在不满足二分的数组内使用二分法 II
- 二分查找
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
500 Lines or Less
Amy Brown、Michael DiBernardo / 2016-6-28 / USD 35.00
This book provides you with the chance to study how 26 experienced programmers think when they are building something new. The programs you will read about in this book were all written from scratch t......一起来看看 《500 Lines or Less》 这本书的介绍吧!