首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏叽叽西

    查找-二分查找

    二分查找的递归与非递归实现 实际上,简单的二分查找并不难写,注意我这里的“简单”二字。下一节,我们会讲到二分查找的变体问题,那才是真正烧脑的。今天,我们来看如何来写最简单的二分查找。 不过,并不是什么情况下都可以用二分查找,它的应用场景是有很大局限性的。那什么情况下适合用二分查找,什么情况下不适合呢? 首先,二分查找依赖的是顺序表结构,简单点说就是数组。 其次,二分查找针对的是有序数据。 再次,数据量太小不适合二分查找。 最后,数据量太大也不适合二分查找。 解答开篇 二分查找的理论知识你应该已经掌握了。 四种常见的二分查找变形问题 上面介绍的二分查找是最简单的一种,即有序数据集合中不存在重复的数据,我们在其中查找值等于某个给定值的数据。 实际上,求“值等于给定值”的二分查找确实不怎么会被用到,二分查找更适合用在“近似”查找问题,在这类问题上,二分查找的优势更加明显。

    1.4K10编辑于 2022-05-17
  • 来自专栏爱笑的架构师

    查找】折半查找二分查找

    折半查找基本要求:待查找数组必须是有序的(以下代码是基于递增有序) /** * 折半查找 * @param a 给定数组 * @param low * @param high * @param k 需要查找的数字 * @return */ public static int bSearch(int[] a, int low, int high, int k){ high)/2; // 取表中间位置 if(a[mid]==k){ return mid; }else if(a[mid]>k){ // 说明需要在a[low...mid-1] 中查找 , 即左边查找 high = mid-1; } else{ // 说明需要在a[mid+1...high] 中查找, 即右边查找 low = mid +1; } } {1, 2, 3, 4, 5}; System.out.println(bSearch(a, 0, a.length-1, 5)); } 输出结果: 4 时间复杂度:O(logn) 平均查找长度

    1.3K20发布于 2020-09-24
  • 来自专栏陶士涵的菜地

    数组(查找-二分查找

    } } 当中间值大于目标值时,最大角标移动到中间角标-1位置 当中间值小于目标值时,最小角标移动到中间角标+1位置 中间角标继续二分 keySearch(arr,7));//索引:3 System.out.println("索引:"+helfSearch(arr,7));//索引:3 } /** * 二分查找 keySearch($arr,7);//索引:3 echo "索引:".ArrayDemo::helfSearch($arr,7);//索引:3 } /** * 二分查找

    1.3K30发布于 2019-09-10
  • 来自专栏c++与qt学习

    二分查找---折半查找

    定义mid = (low+high) / 2,即顺序表的中间位置,然后用所查找的值与mid所在位置处的值比较,由于列表有序,若所查找的值比mid小,则只需在表的前半部分查找,否则只需在表的后半部分查找( 若第一次比较就发现两值相等则直接返回当前值所在的位置),以此类推,直至查找到所寻找的值或确定所查找的值不在该列表内为止(即查找失败)。 有序数组中没有重复元素的情况下 #include<iostream> using namespace std; //二分查找算法---返回查找到的元素的下标 //数组 数组长度 查找的值 int test 我们只需对else语句略作修改 #include<iostream> using namespace std; //二分查找算法---返回查找到的元素的下标 //数组 数组长度 查找的值 int test 递归方法实现 #include<iostream> using namespace std; //二分查找算法---返回查找到的元素的下标 //数组 数组长度 查找的值 int test(int arr

    86310发布于 2021-03-15
  • 来自专栏全栈程序员必看

    二分查找判定树(二分查找树平均查找长度)

    Don’t say much, just go to the code. package org.bood.tree; /** * 二分查找树 * ps:如果 data[0] 等于一组数据中最小的,那么就会增加查找的时间复杂度 { this.data = data; this.left = null; this.rigth = null; } // 二分查找

    73610编辑于 2022-07-27
  • 来自专栏爱撸猫的杰

    二分查找

    description: * @author: Jay * @create: 2020-09-21 19:17 **/ public class TwoSearch { /** * 不使用递归的二分查找 position = commonBinarySearch(arr, key); if (position == -1) { System.out.println("查找的是 ; } else { System.out.println("查找的是" + key + ",找到位置为:" + position); }

    45220发布于 2020-09-22
  • 来自专栏码猿技术专栏

    二分查找

    二分查找算法 1.1. 准备 1.2. 非递归实现 1.3. 递归实现 二分查找算法 对一个有序数组的查找 准备 使用冒泡排序算法对数组排序 12345678910111213 //冒泡排序 , 从小到大public void bubbleSort(Integer array[j-1]=t; } } }} 非递归实现 传入的数组是一个从小到大的数组 123456789101112131415161718192021222324252627 /** * 二分查找算法 * @param array 数组,必须是从小到大有序的 * @param key 查找的关键字 * @return 如果成功查找到,那么返回索引,否则返回-1 */ public Integer -1; //没有找到,返回-1 } 递归实现 12345678910111213141516171819202122 /** * 递归的二分查找 * @param array 从小到大的有序数组

    59440发布于 2018-06-19
  • 来自专栏数据分析与挖掘

    二分查找

    a1=[1,3,4,8,12] def search(a,x): l,r=0,len(a) while l<r: mid=(l+r)//2 if a[mid]==x: return "找到了,位于第%d位置 " % (mid+1) elif a[mid]<x: l=mid+1 else: r=mid return "没有找到" print(searc

    27430发布于 2020-08-26
  • 来自专栏WindCoder

    二分查找

    /* 功能:二分查找 日期:2013-05-16 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define LEN

    57310发布于 2018-09-20
  • 来自专栏JusterZhu

    二分查找

    概要 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 案例 1 请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在次数,并且求出下标,如果没有就提示“没有这个数”。 mind的右边,因此需要递归的向右查找 2.2 findval < arr[mid],说明你要查找的数在mind的左边,因此需要递归的向左查找 2.3 findval == arr[mid] 说明找到, 递归完整个数组,仍然没有找到findval ,也需要结束递归当left > right 就需要退出 代码 internal class BinarySearch { //二分查找算法 思路 本例是二分查找算法 1.在找到mid值,不要马上返回 2.向mid索引值的左边扫描,将所有满足1000的元素的下标加入到一个集合中 3.向mid索引值的右边扫描,将所有满足1000的元素的下标加入到一个集合中

    40320编辑于 2022-12-07
  • 来自专栏大数据和云计算技术

    二分查找

    算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第5篇《二分查找》,非常赞!希望对大家有帮助,大家会喜欢! 前面系列文章: 归并排序 #算法基础#选择和插入排序 由快速排序到分治思想 算法基础:优先队列 二分查找,就和他的名字一样,把一个数组找到他的中间的值和我想要找的值,进行对比,这个时候可以分为三种情况 缺陷:数组必须有序的 应用: 用二分查找法找寻边界值 之前的都是在数组中找到一个数要与目标相等,如果不存在则返回-1。 我们也可以用二分查找法找寻边界值,也就是说在有序数组中找到“正好大于(小于)目标数”的那个数。 用二分查找法找寻区域 之前我们使用二分查找法时,都是基于数组中的元素各不相同。假如存在重复数据,而数组依然有序,那么我们还是可以用二分查找法判别目标数是否存在。

    947100发布于 2018-03-08
  • 来自专栏用户2442861的专栏

    二分查找

    本文对二分查找相关题目做一个总结。 题目列表: 1. 给定一个有序(非降序)数组A,求任意一个i使得A[i]等于target,不存在则返回-1 这个是最原始的二分查找题目,利用数组的有序特性,拆半查找,使得查找时间复杂度为O(logN)。 这里可能会有人想先直接用原始的二分查找,如果不存在直接返回-1,如果存在,然后再顺序找到这个等于target值区间的最左位置,这样的话,最坏情况下的复杂度就是O(n)了,没有完全发挥出二分查找的优势。 这个题目出现了两个数组,有序的,不管怎样我们就应该首先考虑二分查找是否可行。若使用顺序查找,时间复杂度最低为O(k),就是类似归并排序中的归并过程。使用用二分查找时间复杂度为O(logM+logN)。 二分查找的具体实现过程请参考实现代码与注释。

    96640发布于 2018-09-14
  • 来自专栏ShanSan的云原生之路

    二分查找

    二分查找算法 二分查找的基本思想: 将 n 个元素分成大致相等的两部分,取 a[n/2] 与 x(查找目标值) 做比较,如果x == a[n/2] ,则找到 x,算法中止;否则,如果x < a[n/2 使用二分查找算法的前提:待查找序列是有序的 时间复杂度分析 由算法核心思想可知:每次对比都将下一步的比对范围缩小一半。 每次比对后剩余数据项如下表: image.png 最好情况 即要找的元素正好在初始查找序列的中间一次比较出结果,时间复杂度为 O(1) 。 查找成功有多少种情况?查找失败有多少种情况? 为比较次数。

    83030发布于 2020-07-07
  • 来自专栏Vegout

    二分查找

    微信公众号:Vegout 如有问题或建议,请公众号留言 二分查找 数据是海量的,从中提取有价值的信息是必要的,提取的过程也就是查找的过程。 简单粗暴就是顺序查找,任何东西我一个一个来,不管你是有序无序,对我来说都一样。跟今天咱们所说的二分查找相比,顺序查找是低效的,二分查找可以更快的查找出结果。 但同时,二分查找也是有开销的,如果说我们在一个数组中查找一个元素,那么二分查找要求这个数组是有序的。构建这个有序的数组就是相对于顺序查找多出来的开销。 假设我们有这么一个有序数组{0,1,2,3,4,5,6,7,8,9,10,16,35,67,77,778},如果想要查找16所在位置,二分查找的思想就是先将这个数组一分为二,找到中间元素,进行比较,如果大于中间元素 与顺序查找相比,二分查找确实是可以更快的查找出结果,但也正如前文所说,在构建这个有序数组上存在着一定的开销,也就是我们的插入动作有些缓慢,为了在保持高效二分查找的同时,也保证插入的高效性,也就需要一个新的数据结构

    58430发布于 2019-07-03
  • 来自专栏软件开发 -- 分享 互助 成长

    二分查找

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 C++源代码: 1 // 二分查找.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 /****二分查找函数,长度为length 的数组a中查找num,如果查找成功返回下标,否则返回0**/ 8 int binsearch(int *a,int length,int num) 9 { 10 int small=0; 11

    76470发布于 2018-02-05
  • 来自专栏程序员小熊 带你学算法

    二分查找

    二分查找又称折半查找(Binary Search),是一种效率较高的查找方法。 前提 线性表采用顺序存储结构,线性表中的元素是有序排列的。 基本思路 假设线性表中的元素是按升序排列的,先将待查找的区间分成两部分,即[low, mid) 和 (mid, high] ,查找过程从线性表的中间元素开始,如果中间元素恰好是要查找的元素,则结束查找; 如果中间元素大于要查找的元素,则在前半区间 [low, mid) 中查找;否则就在后半区间(mid, high] 中查找;而且跟开始一样先从中间元素开始比较,直到找到要查找的元素或者线性表中不存在该元素 (查找区间最后为空)。 二分查找模板 非递归版本 int binarySearch(int* nums, int numsSize, int target) { if (nums == NULL || numsSize

    57550发布于 2021-05-28
  • 来自专栏全栈学习之路

    二分查找

    nums 中并且下标为 4 示例 2: 输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1 题目解析 题目为二分查找 ,很显然,需用二分查找法实现 二分法的详解请参考我的另一个刷算法解答,这里不一一解释了 如果 nums[i]=target,则下标 ii 即为要寻找的下标; 如果 nums[i]>target,则 target 地址:二分查找 代码实现 class Solution { public int search(int[] nums, int target) { //定义左右指针

    29730编辑于 2023-07-12
  • 来自专栏无限可能的程序开发

    二分查找

    二分查找又称折半查找,整体思路就是一步一步缩小查找范围,直到找到目标值,运用递归实现。 思路分析 二分查找的思路:比如我们要查找的数是findVal 使用的是Golang arr 是一个有序数组,并且是从小到大排序 先找到中间的下标 middle = (leftindex 代码实现 package main import "fmt" // 二分查找函数 // 递归, 边界条件 func binaryFind(arr *[6]int, leftIndex int, rightIndex main() { // 有序数组 var arr [6]int = [6]int{1, 8, 10, 89, 1000, 1234} fmt.Println("arr = ", arr) // 二分查找 /折半查找 binaryFind(&arr, 0, len(arr), 8) } arr = [1 8 10 89 1000 1234] 找到了,下标为1 ----

    34120编辑于 2022-09-26
  • 来自专栏开源优测

    二分查找

    概述 在上文《二分查找》中,我们了解了二分查找基本实现原理和具体的实现算法。 但大家有没有发现,如果目标查找值,如果在查找序列中存在多个,则查找返回的索引值,会有所变化。 那下面我们试着利用二分查找实现以下功能: 查找目标值在序列中第一次出现时的索引 查找目标值在序列中最后一次出现时的索引 例如,有序列如下: seq = [1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8] 我们查找目标值: 5 第一次出现在索引为:4 的位置 最后一次出现在索引为:7 的位置 下面我们对二分查找算法进行策略改造升级为: # 用于实现二分查找第一次出现的算法 first_binary_search (seq, query) # 用于实现二分查找最后一次出现的算法 last__binary_search(seq, query) 代码实现 first优先策略算法实现 # -*- coding:utf -8 -*- __author__ = '苦叶子' # first二分查找算法 # seq 待查序列 # query 要查找的目标 def first_binary_search(seq, query

    1.4K60发布于 2018-04-09
  • 来自专栏用户8057608的专栏

    二分查找

    今日刷题: 任务描述 题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找

    75450发布于 2020-12-16
领券