-
2019-02-26 21:57:40
二分查找算法
二分算法是一种效率比较高的查找算法,其输入的是一个有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否则返回NONE
想象一个场景:
我随便想1~100中的数字,你的目标是以最少的次数猜中我所想的数字,那么你会怎么做呢?- 你可能会从1开始以此往上猜,直到猜中数字,这是一种简单查找算法,每次猜测只能排除一个数字
- 你可能从50开始猜,我告诉你大了或者小了,这样每猜一次,都会将剩余的数字排除掉一半,不管我心里想的是哪个数字,你在7次之内都能够猜到,因为每次猜测都将排除很多数字!
相比之下,第二种方法会更加省时,这种算法叫做二分算法,又称折半查找。
对于要搜索的元素越多,二分查找速度比简单查找快的更多 这是二分查找算法的优点,但二分算法也有缺点,二分算法只针对有序的列表,这样插入和删除就会很困难,因此,折半查找方法只适合不经常变动的有序列表
Python实现二分算法
# 二分算法是一种高效的查找算法,针对有序的数列 def binary_search(my_list, num): """ 二分算法 :param my_list: 有序列表 :param num: 要查找的元素 :return: 存在返回下标 不存在返回NONE """ low = 0 high = len(my_list) - 1 while low <= high: mid = int((low + high) / 2) guess = my_list[mid] if guess == num: return mid elif guess > num: # 说明猜大了 high = mid - 1 else: low = mid + 1 return None def main(): """主函数""" my_list = [1, 3, 5, 7, 9] # 有序列表 num = 2 # 要猜测的数字 print(binary_search(my_list, num)) if __name__ == '__main__': main()
返回num下标 1
二分查找算法运行时间:O(log2 n )
简单查找算法运行时间:O(n)更多相关内容 -
二分算法原理及例题
2022-02-28 22:15:27二分算法 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 ...二分算法
前言
程序员公认的一个公式:程序=数据结构+算法,如此看来算法尤为重要,接下来一起学习下简单入门的二分算法
一、什么是二分呢?
首先让我们一起来玩一个猜数小游戏:
我随便想一个1~100的数字,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会说小了、大了或对了。
那么让我想想你首先会猜什么呢?因为要求是最少的次数查找,不冒险的情况的话你应该会先猜50,因为这样不管我心里的数是比50大还是比50小你都排除了一半数字,下一次依旧在剩有的数字范围内猜中间的数字,这就是所谓的二分算法
二、使用
1.python模板
代码如下(示例):
def binary_search(list,item): # low high用来跟踪要在其中查找的列表部分 low=0 high=len(list)-1 # 循环折半查找 while low<=high: # 检查中间元素 mid=(low+high)/2 # 向下取整 guess=list[mid] # 相等直接返回 if guess==item: return mid # 猜的数比心里的数大,将mid-1赋值给high if guess>item: high=mid-1 # 猜的数比心里的数小,将mid+1赋值给low else: low=mid+1 return None
2.Java例题展示
牛客 NC32求平方根
题目描述如下:
实现函数 int sqrt(int x).
计算并返回 x 的平方根(向下取整)
数据范围: 0 <= x < 2^{31}-10<=x<2要求:空间复杂度 O(1)O(1),时间复杂度 O(logx)O(logx)
示例1输入:
2
返回值:
1示例2
输入:
2143195649返回值:
46294代码如下(示例):
public int sqrt (int x) { // write code here if (x<2){ //小于2时直接返回x return x; } int left=1; int right=x/2; //开根号都小于等于这个数的一半 while (left<right){ int mid=left+(right-left+1)/2;//求中间值 int temp=x/mid; if (mid>temp){ right=mid-1; } else left = mid; } return left; }
总结
以上就是二分的算法原理,模板以及例题,希望对热爱学习的你有所帮助
-
二分搜索算法详解(Binary Search)
2020-12-26 20:35:54二分搜索(Binary Search) 如何确定一个元素在数组中的位置?(假设数组里面全都是整数) 如果是无序数组,从第0个位置开始遍历搜索,平均时间复杂度:O(n) 如果是有序数组,可以使用二分搜索,最坏时间复杂度为O...二分搜索(Binary Search)
-
如何确定一个元素在数组中的位置?(假设数组里面全都是整数)
-
如果是无序数组,从第0个位置开始遍历搜索,平均时间复杂度:O(n)
-
如果是有序数组,可以使用二分搜索,最坏时间复杂度为O(logn)
(一)、二分搜索 — 思路
- 假设在[begin,end)范围内搜索某个元素 v,mid == (begin + end)/ 2
①、如果v < m,去[begin , mid)范围内二分搜索
②、如果v > m,去[mid + 1, end)范围内二分搜索
③、如果v == m ,直接返回 mid - end指的是数组的长度。
(二)、二分搜索 — 实例
(三)、二分搜索 — 实现
import org.junit.Test; import java.util.Arrays; /** * 查找v在有序数组array中的位置 */ public class BinarySearch { public int indexOf(int[] array, int v){ if (array == null || array.length == 0) return -1; int begin = 0; int end = array.length; while (begin < end){ int mid = (begin + end) >> 1; if (v < array[mid]){ end = mid; }else if (v > array[mid]){ begin = mid+1; }else { return mid; } } return -1; } @Test public void test(){ int[] array = {2,4,8,8,9,13,10}; System.out.println(Arrays.toString(array)); System.out.println(indexOf(array,8)); } } 运行结果: [2, 4, 6, 8, 9, 13, 10] 3
- 思考???
如果存在多个重复的值,返回的是哪一个? - 例如:[2,4, 8, 8, 9, 13, 10]
我们通过运行上述的代码,可以看到,它的返回值是3,而不是2,因此我们可以得出结论如果存在多个重复的值,返回的值不确定。
(四)、二分搜索优化
- 在元素 v 的插入过程中,可以先用二分搜索出合适的插入位置,然后再将元素v插入。
- 要求二分搜索返回的插入位置:第1个大于 v 的元素位置
①、如果 v 是 5,返回 2
②、如果 v 是 1,返回 0
③、如果 v 是 15,返回 7
④、如果 v 是 8,返回 5
(1)、二分搜索优化 — 思路
- 假设在[begin,end)范围内搜索某个元素 v,mid == (begin + end)/ 2
①、如果v < m,去[begin , mid)范围内二分搜索
②、如果v >= m,去[mid + 1, end)范围内二分搜索 - end指的是数组的长度。
(2)、 二分搜索优化 — 实例
import org.junit.Test; import java.util.Arrays; public class BinarySearch { /** * 查找v在有序数组array中待插入位置 */ public static int search(int[] array, int v){ if (array == null || array.length == 0) return -1; int begin = 0; int end = array.length; while (begin < end){ int mid = (begin + end) >> 1; if (v < array[mid]){ end = mid; }else{ begin = mid+1; } } return begin; } @Test public void test2(){ int[] array = {2,4,8,8,8,12,14}; System.out.println(Arrays.toString(array)); System.out.println(search(array,5) == 2); System.out.println(search(array,1) == 0); System.out.println(search(array,15) == 7); System.out.println(search(array,8) == 5); } } 运行结果: [2, 4, 8, 8, 8, 12, 14] true true true true
-
-
二分算法和冒泡排序时间复杂度分析
2018-09-25 22:43:03其实这里的底数对于研究程序运行效率不重要,写...二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索...其实这里的底数对于研究程序运行效率不重要,写代码时要考虑的是数据规模n对程序运行效率的影响,常数部分则忽略,同样的,如果不同时间复杂度的倍数关系为常数,那也可以近似认为两者为同一量级的时间复杂度。
二分查找:
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
因此二分查找的时间复杂度就是log(n)!
冒泡排序:
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
所以,冒泡排序最好的时间复杂度为O(n)。
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为:
综上,因此冒泡排序总的平均时间复杂度为
-
二分搜索算法的实现详解
2019-03-25 15:42:51二分查找算法实现 ...在有序数组规模较大时,二分算法是一个优良的查找算法,就像猜数一样(比如从0-200猜),二分算法要求数组是有序的。 若输入数组本身有序,那么二分算法可以轻松取得(前提是数组里有我... -
二分查找算法(Java)
2017-08-14 17:18:121.二分查找算法思想:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x2.时间复杂度:匹配k次后,剩下的元素个数为: n/(2^k) 根据 n/(2^k) >=1 , 即可求出时间复杂度 O(log2... -
Java实现二分查找算法
2020-04-20 00:00:00欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。前言不知道大家玩过这么一个游戏没---猜数字大小。先在心... -
二分查找算法(Java实现)
2018-07-17 10:31:12①适用于经常查找的、但是不变的(增删)的有序...//注意:二分查找必须用在有序列表中进行二分查找 public class BinaryChopTest { public static void main(String[] args) { int[] arrays = {1, 6, 10, 11, 12... -
二分查找法
2020-12-28 22:53:17二分查找法(Binary Search)算法,也叫折半查找算法。二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,直到找到要查找的元素... -
二分查找算法
2021-08-10 09:08:42二分查找属于递归查找的一种,其主要思想是将一个有序数组,分为二分,进行递归,反复为之。 注意: 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 二分查找法的运行时间为... -
[机器学习]二分k-means算法详解
2017-02-05 21:00:05二分k-means算法 二分k-means算法是分层聚类(Hierarchical clustering)的一种,分层聚类是聚类分析中常用的方法。 分层聚类的策略一般有两种: 聚合。这是一种自底向上的方法,每一个观察者初始化本身为一类,... -
可查找重复元素的二分查找算法
2018-05-26 14:14:26可查找重复元素的二分查找算法 思路: 1、先定义两个下标 , left = 0 , right = arr.length -1; 2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right&gt;left 3、因为是二分查找,... -
算法分析与设计 二分查找
2021-05-19 20:05:28算法分析与设计 二分查找 二分查找的基本概念 二分查找是一种在有序数组中查找某一特定元素的查找算法。这种查找方法将查找的时间复杂度从原本的线性时间提升到了对数时间范围,大大缩短了搜索时间。 二分查找... -
二分查找算法(左闭右开区间)
2017-10-13 19:31:33二分查找算法是一个基本但用处十分广泛的算法,但要写出一个没有bug的二分查找算法也不容易,《编程珠玑》一书中提到仅有百分之十的人可以第一次就写出没有bug的二分查找算法,主要原因在于寻找中间区间时数据有可能... -
算法:二分搜索算法(递归)
2019-09-09 16:50:06二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较; 若相等,则查找成功 若大于,则... -
算法1——二分查找和时间复杂度
2018-04-20 09:29:06如何理解二分查找(binary search)?当我们查字典,查电话时,有两种查询方式,一是简单查找,从头开始找,从字母A开始一页一页找;第二种是近似二分查找,如果我们要查询X开头的姓名,势必会直接翻到字典的后半... -
二分查找算法介绍及实现
2019-09-20 09:20:12二分查找法(BinarySearch)算法,也叫折半查找算法。二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,... -
算法整理-二分查找列表最大值
2016-11-04 17:49:09需求描述 已知一个列表是先增后减的半有序列表,现在需要找出列表中的最大值,列表长度... 如果考虑到时间复杂度,且是半有序的列表,收到二分查找的启发,可以使用二分查找,每次比较中间项与其相邻元素的大小,判断 -
二分查找算法及其变种详解
2019-02-15 21:11:47二分查找(Binary Search)算法,也叫折半查找算法,它的思想非常简单,在生活中随处可见(比如:猜字游戏),但这看似简单的算法,实际却没那么容易掌握透彻。 二分查找针对的是一个有序的数据集合,查找思想有点... -
二分概念优缺点以及实现
2020-12-17 16:54:22二分算法 1.简述二分算法的基本思想? 2.二分查找相比于顺序查找有什么优点?又有什么缺点? 3.二分算法可以使用什么方式实现? 答: 1:二分查找算法基本思想: 二分查找算法的前置条件是,一个已经排序好的序列(在... -
夜深人静写算法(四十二)- 二分查找
2021-10-23 11:57:44二分枚举的通用解法 -
Python算法之二分查找
2022-01-21 13:02:25基础的查找算法,二分查找。 -
算法排序----二分排序法
2018-06-09 11:25:35* 那么我们可以将这个有序序列进行二分。 * 左游标left为0,右游标right为i-1(i是这个数字在原数组中的位置) * middle初始为。 * 当left时 * middle是left和right的中值。 * 我们作如下... -
Java实现二分查找算法(非递归)
2021-10-11 10:43:0514.1 二分查找算法(非递归) 14.1.1 二分查找算法(非递归)介绍 之前发过二分查找算法,是使用递归的方式,下面我们用二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列... -
用C语言实现二分查找算法
2016-05-28 18:35:36二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组。若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何... -
二分查找算法(递归+非递归)
2018-10-10 20:44:25二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较; 若相等,则查找成功 若大于,则... -
leetcode算法之二分查找
2022-03-04 01:35:02LeetCode算法之二分查找 前言 对于算法一直抱有恐惧感,觉得没有算法我也写了这么多代码,但周遭的环境让我感觉目前身为一名浅薄知识的敲代码的人,是需要去不断的汲取一些知识,所以就像大学学习英语单词一样,从... -
C语言经典算法之二分查找详解
2022-04-17 20:33:59c语言经典算法之二分查找详解 -
算法分析与设计实验报告——二分搜索算法的实现
2021-02-02 10:22:21算法分析与设计实验报告——二分搜索算法的实现 目录:算法分析与设计实验报告——二分搜索算法的实现一、 实验目的二、实验要求三、 实验原理四、 实验过程(步骤)五、 运行结果六、实验分析与讨论七、实验特色与...