算法系列(二)查找算法--基本查找和二分查找

【Python算法系列十】二分查找算法 二分查找,也叫折半查找,是一种适用于顺序存储结构的查找方法。它是一种效率较高的查找方法,时间复杂度为 O(lgn),但它仅能用于有序表中。也就是说,表中的元素需按关键字大小有序排列。 二分查找用左右两个指针来标注查找范围。程序开始时,查找范围是整个线性表,左指针指向第一个元素,右指针指向最后一个元素;每一次循环过后,查找范围都缩小为原先的一半,直到左右指针重叠或者左指针处于右指针的右侧。因为每次缩小一半的范围,所以可以得出二分查找的时间复杂度为 O(lgn)。 ... 阅读详情
AI摘要

本文介绍了一种高效的查找算法——二分查找。通过对比简单的线性查找,阐述了二分查找在有序数组中如何通过减少搜索范围来提升查找效率。文章提供了非递归和递归两种实现方式,并附带示例代码。

在 算法系列(一)基本概念 一文中,简单介绍了算法基本概念,算法复杂度评估,常用算法证明方式。这篇文章介绍一下查找算法,主要是二分查找算法。

从n个元素中A0,A1....An-1中,找到要找到的元素x,最简单的方法是遍历n个元素,找到元素x则返回x的位置,这种算法的时间复杂度为O(n)。

如果这n个元素是有序的,我们不需要从头到尾遍历一遍就可以找到要查找的元素,可以使用二分法。二分查找的时间复杂度是O(lgn)

二分查找的前提是元素有序(一般是升序),基本思想是拿中间元素A[m]与要查找的元素x进行比较,如果相等,则已经找到,如果A[m]比x大,那么要找的元素一定在A[m]前边,如果A[m]比x小,那么要找的元素一定在A[m]后边。没进行一次查找,数组规模减半。反复将子数组规模减半,直到发现要查找的元素,或者当前子数组为空。

例如,在[1,2,3,4,5]中查找2

第一次找到的数字下标是(0+4)/2=2,找到的数字是3,3<2,要找的数字位置位于[0,2)之间

第二次找到的数字下标是(0+1)/2=0,找到的数字是1,1<2,要找的数字位于(0,1]之间

第三次找到的数字下标是(1+1)/2=1,找到数字2,返回找到的位置1.

如果这个时候找到的数字不是1,那么说明数组中没有要找的数字。

需要注意的点就是区间位置,既然A[m]不等于x,下一次肯定不是从m这个位置开始找的,而是以m+1作为下一个起始位置,或者m-1作为下一个开始位置

二分查找有两种实现方式,一种是递归实现,一种是非递归实现

直接上代码

package com.algorithm.tree;

import java.util.Arrays;

/**
 * 二分查找
 * 
 * @author chao
 *
 */
public class BinarySearchTree {
	/**
	 * 非递归二分查找
	 * 
	 * @param num
	 * @param number
	 * @return
	 */
	public static int binarySearch(int num[], int number) {
		if (num == null || num.length == 0) {
			return -1;
		}
		int start, end, mid;
		start = 0;
		end = num.length - 1;
		while (start <= end) {
			mid = (start + end) / 2;
			if (num[mid] == number)
				return mid;
			else if (num[mid] > number) {
				end = mid - 1;
			} else {
				start = mid + 1;
			}
		}
		return -1;
	}

	/**
	 * 递归查找
	 * 
	 * @param num
	 * @param number
	 * @return
	 */
	public static int RecursivebinarySearch(int num[], int start, int end, int key) {
		int mid = (start + end) / 2;
		if (num == null || num.length == 0 || key < num[start] || key > num[end]) {
			return -1;
		} else if (num[mid] > key) {
			return RecursivebinarySearch(num, start, mid - 1, key);
		} else if (num[mid] < key) {
			return RecursivebinarySearch(num, mid + 1, end, key);
		} else {
			return mid;
		}

	}

	public static void main(String[] args) {
		int num[] = { 3, 5, 7, 9, 10 };
		Arrays.sort(num);
		System.out.println(binarySearch(num, 7));
		System.out.println(binarySearch(num, 8));
		System.out.println(RecursivebinarySearch(num, 0, num.length - 1, 7));
		System.out.println(RecursivebinarySearch(num, 0, num.length - 1, 8));
	}
}

这里的排序直接使用了java的api,后边再详细介绍排序算法

算法实现代码github地址为https://github.com/robertjc/simplealgorithm

后续会不断补充,有些地方写的可能有问题,请多指教。


欢迎扫描二维码,关注我的公众账号



【从零学习经典算法系列】分治策略实例——二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。 阅读详情

相关推荐

【愚公系列】七大查找算法(二)-二分查找

在编程语言中,查找算法是指在一个数据集合中查找某个元素是否存在的算法。常见的查找算法包括:顺序查找(Sequential Search):逐个遍历数据集来查找目标元素,时间复杂度为O(n)。二分查找(Binary Search):在有序数据集合中,从中间位置作为起点不断划分区间并查找,时间复杂度为O(log n)。插值查找(Interpolation Search):在有序数据集合中,根据目标元素与数据集合首尾之间的差值,利用插值估算目标元素的位置,时间复杂度为O(log log n)或O(n)。

愚公智库 47万+

二分查找算法基本思想

二分 二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找。 二分查找很好写,却很难写对,据统计只有10%的程序员可以写出没有bug的的二分查找代码。出错原因主要集中在判定条件和边界值的选择上,很容易就会导致越界或者死循环的情况,本人在看了Acwing视频后有了一定的体会,写了下面的文章 整数二分 二分的本质:把一个区间一分为二,一半满足某个性质,一半不满足某个性质,然后将区间进行划分 eg:上图划分成两个边界,此时要

estxiyang的博客 3679

在安装之后使用labelme出现qtpy.PythonQtError:No Qt bindings could be found错误

我在base环境(python3.7)可成功安装和使用labelme,而在同py37版本和py36的虚拟环境中可安装labelme包,但在使用的时候出现报错,如下: 我尝试着去解决第一个错误提示,错误提示为:moduleNotFoundError:No module named ‘PySide’,结果掉入了一个无止无尽的坑,看到网上有朋友说这个只能在py27-py35才能安装,还有说需要VC+ 140等,他们说的这个解决方案只针对于这个缺包的描述,而我们仅仅只需要一个labelme,因此我直接对后面的错误

qq_33538651的博客 9814

二分查找法

在这里我就是说说我自己的想法。这里困难的,我想就是容易分不清边界,仅仅去选择记忆那个模板(在过了很久以后就会忘记) 二分查找法: 有两个前提条件:1.在查找的内容范围上一定是有顺序的。 2.一次只能查找一个数。假设一个有序的数组{1,2,3,4,5},查找一个targeta=4的位置,运用二分查找可以很快的找到。二分查找方法是不停的进行去迭代,所以划定一个正确的方法是非常重要的。(也就是左右区间开闭的不同)。题目:示例一:示例二:把上面那个代码题解决一下 左闭右闭 左闭右开 其实大概是相同的。...

weixin_51660314的博客 1308

离散数学期末复习笔记【精华版】

文章目录前言一、????理逻辑1. 命题逻辑2. 等值演算3. 主合取范式、主析取范式4. 【题】推理证明5. 辖域、自由变元、约束变元二、????合1. 环和、环积,幂集,笛卡尔乘积三、 ????????关系1. 自反、对称、传递2&3. 合成运算,逆关系、闭包4. 哈斯图、上下界、偏序5. 等价关系、划分四、????1. 幺元(么元、单位元)、零元、逆元,半群、群、阿尔贝群、独异点、循环独异点2. 【题】由表判断3. 【题】证明五、????论1. 简单图、平凡图、多重图、子图、补图、出度、入度、

林大夕可的博客 17万+

手把手教你用ComfyUI搭建高效AI绘画工作流:从基础到高级技巧

本文详细介绍了如何使用ComfyUI构建高效的AI绘画工作流,从基础配置到高级技巧全面覆盖。通过模块化设计,ComfyUI显著提升显存利用率和创作灵活性,适合从新手到专业用户。文章包含部署指南、工作流搭建、性能优化及行业应用案例,帮助读者快速掌握AI绘画核心技术。

7up55的博客 718

二分查找+实例

本篇文章,主要介绍了二分查找,java代码实现二分查找和实例应用。

qq_53443536的博客 4436

CentOS8安装NVIDIA显卡驱动、CUDA和Anaconda

CentOS8安装NVIDIA显卡驱动和CUDA 参考:CentOS nvidia+cuda+cudnn 安装 安装英伟达显卡驱动 1、检查是否安装了NVIDIA的GPU(硬件层面): lspci | grep -i nvidia 2、安装GCC、kernal组件、dkms等 sudo yum install gcc sudo yum install gcc-c++ sudo yum -y install kernel-devel sudo yum -y install kernel-headers s

智慧的旋风的博客 1万+

【MySql】基本查询

【MySql】基本查询

weixin_60478154的博客 5371

ORB-SLAM3单目+IMU实战:从数据加载到位姿优化的完整流程解析

本文详细解析了ORB-SLAM3单目+IMU模式的完整实战流程。从EuRoC等数据集的数据格式准备、系统启动与数据流入口,到帧构建、IMU预积分、视觉-惯性联合初始化,再到基于运动模型的跟踪、局部地图优化及多线程协同,提供了从环境配置到代码解读的全面指南,并分享了参数调优与性能分析的实用调试经验。

weixin_29085151的博客 296

3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)

本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。

g9h0i1的博客 975

二分查找【多种方法+图解】

二分查找

Jambo!的博客 6060

Wi-Fi数据帧类别

QoS

1042484520@qq.com(邮箱) 3156

【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

二分查找算法的学习:二分查找、在排序数组中查找元素的第⼀个和最后⼀个位置、搜索插⼊位置、x的平方根、⼭峰数组的峰顶、寻找峰值、搜索旋转排序数组中的最⼩值

不能再留遗憾了的博客 4428

【电弧】基于matlab simulink电弧仿真模型(Mayr Cassie电弧模型)【含Matlab源码 9226期】

simulink电弧仿真模型(Mayr Cassie电弧模型) 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 193

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【算法系列 | 8】深入解析查找算法之—二分查找

二分查找算法(Binary Search),也称为折半查找,是一种用于在有序数据集合中查找目标元素的高效算法。 它的核心思想是将查找范围逐渐缩小一半,直到找到目标元素或确定目标元素不存在为止。

颜淡慕潇 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【算法分析】查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找。

小魏的修行路 4万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数组的二分查找算法

C语言:分支、循环结构语法基础巩固

qq_73270870的博客 2089

二分查找之红蓝二分查找

/ 目标值在左半部分} else {left = mid;// 目标值在右半部分left : -1;// 返回最后一个满足条件的值的索引。

xiaoxie8023的博客 2326

探索算法系列 - 二分查找算法

二分查找、在排序数组中查找元素的第一个和最后一个位置、搜索插入位置、x 的平方根、山脉数组的峰顶索引、寻找峰值、寻找旋转排序数组中的最小值、点名。

Russ_Leo的博客 1238

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法。 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等。 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等。 1.顺序

susandebug 7787

(一)算法--查找算法顺序查找和二分查找(递归和非递归方式)

我们抛开二分查找算法,如果有这样的一个需求,需要在一些数字中找出有没有某个数字,我们应该怎么做?          1 首先我们会想到用什么数据结构存放这些数?          数据结构就是计算机存储组织、组织数据的方式。可以这样理解,生活中我们穿的衣服需要放到一个地方,衣服可以放到衣橱中,也可以放到行李箱中,也可以放到衣架中,这里的衣架、衣橱、和行李箱及是衣服的存放结构。所

Xinghf 8738

算法系列——二分查找算法及其变体总结

基础二分查找只能找到指定target在序列中的位置,假如target有重复值,二分查找只能返回其中某个target的位置,这个位置并不确定,主要跟target值的起始位置和重复序列的长度有关系。

BridgeGeorge 2149
上一篇: android开发播放声音文件
下一篇: android 图片压缩
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值