首页 > 编程语言 >查找——数据结构与算法学习

查找——数据结构与算法学习

时间:2022-11-06 21:12:56浏览次数:39  
标签:arr temp int findVal mid 算法 查找 数据结构

查找算法

二分查找(初始二分查找)

算法原理:就是一个分治的思想:分而治之,不断划分数据的查找范围,就可以提高查找效率,效率达到了O(logn)

前提:必须对应的是有序列表

//手写二分法,需求是返回索引
    public static int binarySearch3(int[] arr,int left,int right,int findVal){
        if(left > right){
            return -1;//这是退出索引的条件,说明没有返回数据
        }
        int mid = (left + right)/2;//中间的索引
        int midVal = arr[mid];
        if(findVal > midVal){
            return  binarySearch3(arr,mid + 1,right,findVal);//向右递归
        }else if(findVal < midVal){
            return binarySearch3(arr,left,mid - 1,findVal);//向左递归
        }else{
            return mid;//相当于此时midVal = arr[mid],现在只是找回索引而已。
        }
    }

——但是遇到如果查询的数字有多个的怎么办呢?这时就要引入数组的思想来进行优化。

//优化版的查找算法,能够完全查找出全部的数据
    public static List<Integer> binarySearch2(int arr[],int left,int right,int findVal){
        if(left > right){
            return new ArrayList<Integer>();
        }
        int mid = (left + right)/2;
        int midVal = arr[mid];

        if(findVal > midVal){
            return binarySearch2(arr,mid + 1,right,findVal);
        }else if(findVal < midVal){
            return binarySearch2(arr,left,mid - 1,findVal);
        }else{
            ArrayList<Integer> integers = new ArrayList<>();
            //向左扫描,满足1000的元素加入集合ArrayList
            int temp = mid - 1;
            while(true){
                if(temp < 0 || arr[temp] != findVal){
                    break;
                }
                integers.add(temp);
                temp --;
            }
            integers.add(temp);
            //向右扫描,满足1000的元素加入集合ArrayList
            temp = mid + 1;
            while(true){
                if(temp > arr.length - 1 || arr[temp] != findVal){
                    break;
                }
                integers.add(temp);
                temp ++;
            }
            return integers;
        }
    }

思考加入了使用while(true)结构进行扫描,真的很有才。

插值查找(插值二分查找)

算法原理:就是在二分查找的基础上补充了一个自适应索引

对应的代码公式:

int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

适用于数据量较大,关键字分布比较均匀的查找表中。

斐波那契查找(黄金分割法二分查找)

算法原理:就是在二分查找的基础上引入黄金分割的思想

关键:为什么 mid=low+F(k-1)-1,F(k-1)-1区间是为什么?

通过设计该算法:使正好该数列中空出一个mid位置

public static int[] fib(){
        int[] f = new int[maxSize];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < maxSize ; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

    public static int fibSearch(int a[],int key){
        int low = 0;
        int high = a.length - 1;
        int k = 0;
        int mid = 0;
        int f[] = fib();
        while(high > f[k] - 1){
            k++;
        }
        int[] temp = Arrays.copyOf(a, f[k]);
        for(int i = high + 1; i < temp.length; i++) {
            temp[i] = a[high];
        }
        while(low <= high){
            mid = low + f[k - 1] - 1;
            if(key < temp[mid]){
                high = mid - 1;
                k--;//这个是由斐波那契数列所拆开来的
            }else if(key > temp[mid]){
                low = mid + 1;
                k -= 2;//这个是由斐波那契数列所拆开来的
            }else{
                if(mid <= high){
                    return mid;
                }else{
                    return high;
                }
            }
        }
        return -1;
    }

标签:arr,temp,int,findVal,mid,算法,查找,数据结构
From: https://www.cnblogs.com/robyn2022/p/16863971.html

相关文章

  • VS“无法查找或打开PDB文件”是怎么回事?如何解决
    有时候,我们使用VS(VisualStudio)编译程序时会出现“无法查找或打开PDB文件”的提示,并且此时程序会生成失败,无法运行,如下图所示:大家不要惊慌,出现这种提示并不是代码写错了......
  • 实验二:逻辑回归算法实验
    【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。......
  • 704. 二分查找
    704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例......
  • 生长算法和巡中线算法python实现代码示例(自用)
    生长算法和巡中线算法python实现代码示例(自用)importcv2importtimeimportnumpyasnpfrommathimportpi,isnan#PID算法类classPID():_kp=_ki=_kd......
  • 实验二:逻辑回归算法实验
    【实验目的】1.理解逻辑回归算法原理,掌握逻辑回归算法框架;2.理解逻辑回归的sigmoid函数;3.理解逻辑回归的损失函数;4.针对特定应用场景及数据,能应用逻辑回归算法解决实际分......
  • 二叉树中查找后继节点问题
    二叉树中查找后继节点问题作者:Grey原文地址:博客园:二叉树中查找后继节点问题CSDN:二叉树中查找后继节点问题题目描述给定一个二叉查找树,以及一个节点,求该节点在中序遍......
  • K-近邻算法
    1.K-近邻算法的概述K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k......
  • 排序——数据结构与算法学习
    排序冒泡排序法(交换)基本原理:依次比较相邻元素的值,使值较大的元素逐渐前移或者后移,因为每一轮排序后值最大的元素一定是后移了一位。//手写冒泡排序法publicstaticvo......
  • 实验二:逻辑回归算法实验
    实验二:逻辑回归算法实验 【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻......
  • RSA加密算法
    RSA加密算法概述    RSA算法是一种经典的非对称加密算法,密钥一般由三个数字构成:N、E、D。对于一些信息,我们总有办法将其转化为数字,设该数字为X,对应的密文是Y。则......