首页 > 编程语言 >查询算法——顺序查找(优化),二分查找(递归)

查询算法——顺序查找(优化),二分查找(递归)

时间:2023-11-01 21:58:57浏览次数:33  
标签:二分 arr return target 递归 int 查找 array

顺序查找
顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构,从第一个元素开始逐个与需要查找的元素x进行比较,当比较到元素值相同时,返回元素m的下标,如果比较到最后都没有找到,则返回-1;
时间复杂度为O(n)

点击查看代码
public static void main(String[] args) {
        int[] array = {12, 3, 43, 5, 9};
        int target = 43;
        int[] newArray = new int[array.length + 1];
        newArray[0] = target;
        for (int i = 0; i < array.length; i++) {
            newArray[i + 1] = array[i];
        }


    }

    //顺序查找 封装方法
    /*private static int sequenceSearch(int[] array, int target) {
        for (int i = 0; i < array.length; i++) {
            if (target == array[i]) {
                return i;
            }
        }
        return -1;
    }*/

优化
面对大量数据时,常常要使用预处理或者清洗操作
将要查询的数据放到新数组的第一个,然后将要查询的数组放入新数组进行查询

  

  //查询方法,从最后一位元素往前查询,一直到第一个
    public static int sequenceSearchPlus(int[] arr, int key) {
        int n = arr.length - 1;
        arr[0] = key;
        while (arr[n] != key) {
            n--;
        }
        return n;
    }

}

二分查找
/*
* 在有序数组中查找某一特定元素的查找算法
*用给定k值先于中间节点的关键字比较,中间节点把线性表分为两个子表,若相等
* 则查找成功;若不相等,再根据k与该中间节点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点
* 折半搜索每次将搜索区域减少一半,时间复杂度为O(logn)
* 空间复杂度O(1)
*
* 当查找表不会频繁更新,删除操作时,使用折半查找是比较理想的
* 如果查找表有频繁的更新,删除操作,维护表的有序会花费比较大的精力,不建议使用该查找方式
* */

点击查看代码
 static int binarySearch1(int arr[], int len, int target) {
        //初始化左右搜索边界
        int left = 0, right = len - 1;
        int mid;
        while (left <= right) {
            //中间位置:两边界元素之和/2 向下取整
            mid = (left + right) / 2;
            //arr[mid] 大于target,即要寻找的元素在左半边,所以需要设定右边界为mid-1,搜索左半边
            if (target < arr[mid]) {
                right = mid - 1;

                //arr[mid]小于target,即要寻找的元素在右半边,所以需要设定左边界为mid+1,搜索右半边
            } else if (target > arr[mid]) {
                left = mid + 1;
                //搜索到对应元素
            } else if (target == arr[mid]) {
                return mid;
            }
        }

        return -1;
    }

递归法

点击查看代码
static int binarySearch2(int array[], int left, int right, int target) {
        if (left <= right) {
            int mid = (left + right) / 2;
            if (array[mid] == target) {
                return mid;
            } else if (array[mid] < target) {
                return binarySearch2(array, mid + 1, right, target);
            } else {
                return binarySearch2(array, left, mid - 1, target);
            }
        } else {
            return -1;
        }
    }

标签:二分,arr,return,target,递归,int,查找,array
From: https://www.cnblogs.com/yifan0820/p/17804191.html

相关文章

  • fibnacci数列递归/迭代实现
    什么是fibnacci数列?斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-......
  • Codeforces Round 907 (Div. 2) B. Deja Vu(二分+后缀和+位运算)
    CodeforcesRound907(Div.2)B.DejaVu思路:预处理31位的\(2^x\)存在\(tmp_i\)对于输入\(a_i\),通过查找最后一个二进制1位置,存在\(x0_i\)由题意可知,对于输入的\(x\),如果有\(a_i\)可整除\(x\),则会使\(a_i\)加上\(2^{x-1}\)所以之后除非是\(x-1\),否则无效,因此把输入\(x\)......
  • 随机查找(一切看命)
      对于一个给定的数组,若要查找当中是否包含某个值,传统的方法是遍历数组中的每一个元素,如果找到则返回。如果学习过数据结构,也可以立马想到用哈希表来存储,哈希表的查找性能优异,一般可以达到O(1)的时间复杂度,在最坏情况下也有可能达到O(n)的复杂度。但是今天,我将带来一种有意思的......
  • 递归函数实现省市区多级联动搜索帮助
    1、需求背景当程序中有互为层级的字段,需要使用搜索帮助时,可以通过多次调用搜索帮助来实现。比如在程序中需要填写省市区三级地址2、实现方式2.1、平铺直叙程序的搜索帮助,通常使用F4IF_INT_TABLE_VALUE_REQUEST来实现。多级的搜索帮助,可以简单的通过多次调用F4函数来实现。点......
  • 如何在excel中查找问号“?”星号“*”和“~”号
    Excel查找替换时如何使用通配符的问号? 若需要查找问号“?”,则在查找内容文本框中输入“~?”若需要查找星号“*”,则在查找内容文本框中输入“~*”。若需要查找问号“~”,则在查找内容文本框中输入“~~”。......
  • 数据结构——二分查找(1)
    ``点击查看代码importjava.util.Scanner;publicclassMain{publicstaticint[]a=newint[10];publicstaticvoidmain(String[]args){Scanners=newScanner(System.in);intn=s.nextInt();intb......
  • 二分查找算法题1
    /***https://leetcode.cn/problems/sqrtx/description/*二分查找*将数据分成两部分*第一部分为平方小于等于target*另外的为大于target*left=mid。right=mid-1;使用+1求中**/publicstaticvoidhanShu19(intx){......
  • 二分模板 Acwing 789 数的范围
     二分一定有解,若出现无解,一定是题目中无解二分步骤:定义check函数,先找到一个x,使得区间左边满足条件区间右边不满足条件,定义mid=l+r>>1去判断于x的关系,此时需要判断边界关系,例如当a[mid]小于x时,说明二分值在x的左边,此时缩小范围为【mid,r】,即令l=mid,此时返回check函数,......
  • SqlServer的With递归查询子父级
    工作中有一个需求,要判断客户是否有后续订单,就是查后面的订单是否此客户ID下单,而且要把此客户的所有关联的客户也都判断上这有点头痛,因为关联客户是一个嵌套型父子级的结构,客户A关联客户B,客户B关联客户C,客户C关联客户D,无论取客户A、B、C、D任一一个去查,都要把整个关联关系的客户A......
  • java怎么递归
    在Java中,递归(Recursion)是指一个方法在其内部调用自身的过程。递归通常用于解决可以被分解成相似子问题的问题。在编写递归函数时,需要定义递归的结束条件,以防止无限循环。下面是一个简单的递归示例,演示了如何使用递归计算一个数的阶乘:publicclassMain{publicstaticvoi......