算法二——二分查找

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

思考题目

1 用最省内存的方式查找数据。
2 快速定位ip所在省市

二分查找的速度

二分每次都通过跟区间中的中间元素对比,将待查找的区间缩小为一半,直到区间为0或者找到元素。需要重点关注退出条件、mid取值、low和high的更新。

二分的时间复杂度O(logn)。logn少的惊人之处和指数的大的惊人之处类似。2的32次方是4亿多。在4亿多有序数组中查找数据,只需要32次。很少吧。

简单代码实现

简单是因为数组中没有重复数据。

	 public static int easySearch(int[] a,int value){if(a==null) return -1;int n = a.length;int low = 0;int high = n-1;return easySearch(a, value, low, high);}private static int easySearch(int[] a,int value,int low,int high){if(low>high) return -1;int mid = low + ((high-low)>>1);if(value==a[mid]) return mid;if(value<a[mid]) return easySearch(a,value,low,mid-1);return easySearch(a,value,mid+1,high);}

二分的应用场景

1 二分依赖的是顺序表,也就是数组。链表复杂度变高。因为链表随机查找的时间复杂度是O(n)。
如果使用链表,第一次查找a[mid],需要n2\dfrac{n}{2}2n次查找,第二次查找a[mid],需要n4\dfrac{n}{4}4n次查找,依次类推所需要的查找有sum=n2+n4+n8+....+1=n−1sum=\dfrac{n}{2}+\dfrac{n}{4}+\dfrac{n}{8}+....+1=n-1sum=2n+4n+8n+....+1=n1。时间复杂度O(n)。

2 二分针对的是有序数据。在插入、删除比较少的场景中,可以将排序的时间成本均摊到查询上面。插入、删除多,则复杂度升高。

3 数据量小不能体现二分的优势。例如10个数据。无论顺序查找还是二分,时间差不多。

4 数据量不能太大。因为二分依赖数组存储数据,数组要求连续的内存。

思考题

在100M内存中,查找1000万整数的某个数。如果用long表示整数,一个整数8个字节,1000万整数,80M内存。可以先使用空间复杂度低的排序算法排序,之后二分查找。

求一个数的平方根,精确到小数点后6位。

二分的变体

查找第一个等于value的元素的位置

	 public static int findFirstEqualElement(int[] a ,int value){if(a==null) return -1;int n = a.length;int low = 0;int high = n-1;while(low<=high){int mid = low + ((high-low)>>1);if(value<a[mid]){high = mid - 1;}else if(value>a[mid]){low = mid +1;}else{if(mid==0 || a[mid-1]!=value)return mid;elsehigh = mid-1;}}return -1;}

最后一个等于value的元素的位置

	public static int findLastEqualElement(int[] a ,int value){if(a==null) return -1;int n = a.length;int low = 0;int high = n-1;while(low<=high){int mid = low + ((high-low)>>1);if(value<a[mid]){high = mid - 1;}else if(value>a[mid]){low = mid +1;}else{if(mid==n-1 || a[mid+1]!=value)return mid;elsehigh = mid-1;}}return -1;}

查找第一个大于等于value的元素的位置

	public static int findFirstMoreOrEqualElement(int[] a ,int value){if(a==null) return -1;int n = a.length;int low = 0;int high = n-1;while(low<=high){int mid = low + ((high-low)>>1);if(value<=a[mid]){if(mid==0 || a[mid-1]<value) return mid;high = mid - 1;}else if(value>a[mid]){low = mid +1;}}return -1;}

查找最后一个小于等于value的元素的位置

public static int findLastLessOrEqualElement(int[] a ,int value){if(a==null) return -1;int n = a.length;int low = 0;int high = n-1;while(low<=high){int mid = low + ((high-low)>>1);if(value<a[mid]){high = mid - 1;}else if(value>=a[mid]){if(mid==n-1 || a[mid+1]>value)return mid;low = mid +1;}}return -1;}

思考题

快速定位ip所在省市。可以用一个32位的int表示一个ip地址。查找每一个ip段内,最后一个起始ip小于等于目标ip的ip段,然后查找目标ip是不是在这个范围内。

循环有序数据的二分查找怎么解决,数组是升序。
 需要先找到第一个a[i]&lt;a[i+1]a[i]&lt;a[i+1]a[i]<a[i+1],例如数组nums={4,5,6,7,0,1,2}。i应该等于4。然后我们可以选择将数组复制一下成为{0,1,2,4,5,6,7},但是这样时间复杂度就会是O(n)。我们也可以这样看nums[4]=0,nums[5]=1,nums[6]=2,nums[7]=4,nums[8]=5,nums[9]=6,nums[10]=6。相当于将nums看做是一个循环数组。

 public int search(int[] nums, int target) {int n = nums.length;int low = 0;int high = n-1;while(low<high){int mid = (low+high)/2;if(nums[mid]>nums[high]){low = mid +1;}else{high = mid;}}int rotatedIndex = low;low = 0;high = n-1;while(low<=high){int mid = (low+high)/2;int realMid = (mid+rotatedIndex)%n;if(nums[realMid]<target){low = mid+1;}else if(nums[realMid]>target){high = mid-1;}else{return realMid;}}return -1;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Kali][VMware][2020][窗口大小][分辨率]高分辨率自适应

1.Vmware->查看->自动调整大小->自动适应窗口 2.Kali现在提供了HiDPI模式。此模式可调整GTK&#xff0c;QT甚至基于Java的界面的缩放比例&#xff0c;因此用户无需手动修改每个界面。您可以通过从应用程序菜单中打开“ Kali HiDPI模式”或kali-hidpi-mode从终端运行来…

第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧

拿到一个网络包时&#xff0c;我们总是希望它是尽可能小的。操作一个大包相当费时&#xff0c;有时甚至会死机。如果让初学者分析1GB以上的包&#xff0c;估计会被打击得信心全无。所以抓包时应该尽量只抓必要的部分。 作者&#xff1a;科技yuan 一、抓包 拿到一个网络包时&a…

Beta冲刺(9/7)——2019.5.31

作业描述 课程软件工程1916|W(福州大学)团队名称修&#xff01;咻咻&#xff01;作业要求项目Beta冲刺&#xff08;团队&#xff09;团队目标切实可行的计算机协会维修预约平台开发工具Eclipse团队信息 队员学号队员姓名个人博客地址备注221600207黄权焕https://www.cnblogs.co…

数据结构三——跳表

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 跳表的由来 说明&#xff1a;图片来自极客时间 由来   二分查找的数据结构是数组&#xff0c;利用数组随机访问的特定查找的时间复杂度是O(logn)。如果数据结构是…

[BUGKU][CTF][MISC][2020] MISC writeup持续更新中

CTF总结 ctf基本操作&#xff1a;https://blog.csdn.net/mafucan/article/details/106886421 zip: https://www.anquanke.com/post/id/86211 找软件推荐网址 1.https://www.52pojie.cn/ 2.没有的话百度一下 去找百度云 工具下载&#xff1a; stegSolve 隐写分析 需要配置Java…

spring学习(1):初始项目

1打开idea----new project 2点击建立项目的类型maven 点击next 3点击next 4选择路径&#xff0c;点击完成 5建立成功之后修改pom.xml配置文件 添加&#xff0c;解决依赖关系 <dependencies><dependency><groupId>org.springframework</groupId><ar…

while语句学习

while语句 while [break][continue] break 退出当前循环continue 退出当前循环&#xff0c;并重新循环。执行语句可以是单个语句或语句块。判断条件可以是任何表达式&#xff0c;任何非零、或非空&#xff08;null&#xff09;的值均为true。 当判断条件假false时&#xff0c;循…

[密码学][困难问题][常见规约]密码学问题常见困难问题

参考网址(科学上网) 密码学问题常见困难问题,需要点击参考网址进行查找 其困难问题的介绍非常友好&#xff0c;请根据目录快速找到相关资料 以下是检索 目录 Discrete logarithm problem DLP: discrete logarithm problem CDH: computational Diffie-Hellman problem SDH:…

数据结构四——散列表(下)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 7 散列表链表的应用 很多情况下散列表会和链表一起使用。散列表可以通过key查找value。链表可以按照value进行排序。这样就能通过value查找key&#xff0c;也可以通…

spring学习(2):初始化spring程序

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

Asp.Net Core 第05局:读取配置

前言 本文介绍Asp.Net Core 读取配置文件。环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 前期准备 1.添加app.json文件并在里面添加内容&#xff1b; 2.将app.json文件配置到应用中&#xff1b; 3.添加app.json对应的AppConfig类&#xff1b; 4.下面三种方式读取配置文…

[BUGKU][CTF][PWN][2020] PWN writeup

准备UBUNTU pwndbg pwntools PWN1 关键字&#xff1a;nc 知识点&#xff1a;nc使用方法 https://www.cnblogs.com/nmap/p/6148306.html nc命令是一个功能打包的网络实用程序&#xff0c;它通过命令行在网络上读取和写入数据;nc是为NMAP项目编写的&#xff0c;是目前已分裂的ne…

spring学习(3):获取bean对象

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

数据结构四——散列表(上)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1散列表的由来 从数组随机访问特性说起。  数组的随机访问特性是&#xff1a;数组a,a[5]可以直接访问到数组的第6个元素。这就类似于在下标和数组对应的值之间建立…

java实训 :异常(try-catch执行顺序与自定义异常)

关键字&#xff1a;try:执行可能产生异常的代码catch:捕获异常finally:无论是否发生异常代码总能执行throws:声明方法可能要抛出的各种异常throw:手动抛出自定义异常用 try-catch-finally 异常处理&#xff1a;情况一(正常运行&#xff0c;无异常)&#xff1a;执行try,执行fina…

[BUGKU][CTF][Reverse][2020] Reverse writeup 1-7 暂时肝不动了

Reverse 入门逆向 步骤: ida main函数 按R Reverse signin 关键字&#xff1a; 知识点&#xff1a;Android逆向分析。&#xff08;常用工具&#xff1a;安卓模拟器、JEB、Cyberchef、Androidkiller&#xff09; 步骤: 1.用jeb打开&#xff0c;找到MainActivity&#xff0c;右…

spring学习(4):spring管理对象之间的关联关系

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

算法三——递归

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。   递归是非常常用的编程技巧。但是学习过程中往往很容易递出去&#xff0c;却归不回来。 1生活中的例子理解递归 在电影院里面如果你想知道自己在第几排坐着。电影…

[Lua]LuaAPI整理

ref &#xff1a;https://blog.csdn.net/ouyangshima/article/details/43339571 LUA和C/C的沟通桥梁——栈 Lua生来就是为了和C交互的&#xff0c;因此使用C扩展Lua或者将Lua嵌入到C当中都是非常流行的做法。要想理解C和Lua的交互方式&#xff0c;首先要回顾一下C语言是如何处理…

[hackinglab][CTF][基础关][2020] hackinglab 基础关 writeup

在线工具&#xff1a;https://www.qqxiuzi.cn/daohang.htm 基础关 1 key在哪里&#xff1f; 知识点&#xff1a;F12查看源代码 步骤:F12 基础关 2 再加密一次你就得到key啦~ 知识点&#xff1a;ROT13 步骤: 基础关 3 猜猜这是经过了多少次加密&#xff1f; 关键字&#xf…