【算法】常用查找算法(顺序查找、二分查找、插值查找、斐波那契查找)
创始人
2024-04-27 05:15:34
0

目录

  • 查找算法
    • 1.线性(顺序)查找
      • (1)思路
      • (2)代码实现(java)
    • 2.二分(折半)查找
      • (1)思路
      • (2)代码实现(java)
    • 3.插值查找
      • (1)思路
      • (2)代码实现(java)
    • 4.斐波那契(黄金分割法)查找
      • (1)思路
      • (2)代码实现(java)

查找算法

1.线性(顺序)查找

(1)思路

判断序列中是否包含某个元素,找到提示并输出下标值
初始数组:{13,4,88,28,6},找到88这个值的下标。

(2)代码实现(java)

/*** 顺序(线性)查找* author:xinxin*/
public class SeqSearch {public static void main(String[] args) {int[] arr = {13,4,88,28,6};int result = seqSearch(arr,88);System.out.println("下标为:"+result);}/*** @param arr  无序序列* @param value 需要找的值* @return*/public static int seqSearch(int[] arr,int value){//线性查找,逐一对比,发现相同值,返回下标for (int i = 0; i < arr.length ; i++) {if (arr[i] == value){return i; //返回下标}}return -1;}
}

2.二分(折半)查找

(1)思路

注意:二分查找的前提是序列是有序的。
初始数组:{1,2,3,4,5,6,7,8,9},查找3这个值,并输出下标,没有就提示

在这里插入图片描述

(2)代码实现(java)

/*** 二分查找* author:xinxin*/
public class BinarySearch {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7,8,9};List resValList = binarySearch(arr, 0, arr.length - 1, 3);System.out.println("要找的值下标为:"+resValList);}/*** @param arr    初始数组* @param left   左索引* @param right  右索引* @param value  要找的值* @return*/public static List binarySearch(int[] arr, int left, int right, int value){//没找到值if (left > right){return new ArrayList();}int mid = (left + right) / 2;int midVal = arr[mid];//向右递归if (midVal < value){return binarySearch(arr,mid+1,right,value);}else if (midVal > value){//向左递归return binarySearch(arr,left,mid-1,value);}else{//正好找到了(包含出现多个相同的值)ArrayList resValList = new ArrayList<>();//向左扫描,看看是否存在相同的值int temp = mid - 1;while(true){if (mid < 0 || arr[temp] != value){//退出break;}resValList.add(temp);temp = temp - 1;//左移}//向右扫描,看看是否存在相同的值temp = mid + 1;while(true){if (mid > arr.length-1 || arr[temp] != value){//退出break;}resValList.add(temp);temp = temp + 1;//右移}resValList.add(mid);return resValList;}}
}

3.插值查找

(1)思路

插值查找类似于二分查找,不同的是每次都是mid处查找,对于数据量比较大,分布比较均匀,适合用插值查找。
公式:mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]) //left代表左索引,right代表右索引,value就是要查找的值
初始数组:[1,2,3…100]
找值 1 , mid = 0 + (99 - 0) * (1 - 1) / (100 - 1) = 0
找值100,mid= 0 + (99 - 0)*(100 - 1)/(100 - 1) = 99

(2)代码实现(java)

/*** 插值查找* author:xinxin*/
public class InsertSearch {public static void main(String[] args) {int[] arr = new int[100];for (int i = 0; i < 100; i++) {arr[i] = i + 1;}int index = insertSearch(arr,0,arr.length-1,23);System.out.println("下标为:"+index);}public static int insertSearch(int[] arr,int left,int right,int value){//要找的值不存在if (left > right || arr[left] < arr[0] || arr[right] > arr[arr.length-1]){return -1;}//找mid的公式int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);if (arr[mid] > value){//向左递归return insertSearch(arr,left,mid-1,value);}else if (arr[mid] < value){//向右递归return insertSearch(arr,mid+1,right,value);}else{//正好找到return mid;}}
}

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

(1)思路

黄金分割:一条线段分割成两部分,其中一部分比上全长,接近0.618。
和前面两个相似,仅仅改变了中间结点(mid),mid位于黄金分割点附近,mid = left + F(k-1)-1, F是斐波那契数列,k代表第几个元素。
斐波那契数列:{1,1,2,3,5,8,13} 从第三个元素开始,就是前两个数相加的值。
初始数组:{1,6,16,26,888,1234},使用斐波那契查找。

在这里插入图片描述

(2)代码实现(java)

/*** 斐波那契查找* author:xinxin*/
public class FibonacciSearch {static int  maxSize = 20;public static void main(String[] args) {int[] arr = {1,6,16,26,888,1234};int resVal = fibonacciSearch(arr,16);System.out.println("斐波那契查找下标为:"+resVal);}/*** 生成一个斐波那契数组* @return*/public static int[] fib(){int[] fib = new int[maxSize];fib[0] = 1;fib[1] = 1;for (int i = 2; i < maxSize; i++) {fib[i] = fib[i-1] + fib[i-2];}return fib;}/*** @param arr   初始数组* @param value 要查找的值* @return 返回值,没找到返回 -1,找到返回下标*/public static int fibonacciSearch(int[] arr,int value){int left = 0;int right = arr.length-1;int k = 0; //斐波那契数值的下标int mid = 0;int[] fib = fib();//获取斐波那契数列//获取斐波那契分割数值下标while(right > fib[k] - 1){k++;}int[] temp = Arrays.copyOf(arr,fib[k]);for (int i = right + 1; i < temp.length; i++) {temp[i] = arr[right];}//找到我们要找的值while(left <= right){mid = left + fib[k-1] - 1;if (value < temp[mid]){//向左查找right = mid - 1;k--;}else if (value > temp[mid]){//向右查找left = mid + 1;k = k - 2;}else {//找到if (mid <= right){return mid;}else {return right;}}}return -1;}
}

相关内容

热门资讯

安卓新系统好还是旧系统,安卓新... 你有没有发现,每次安卓系统更新,朋友圈里就炸开了锅?有人欢呼雀跃,有人愁眉苦脸。那么,安卓新系统真的...
安卓系统主要界面元素,探索主要... 你有没有发现,每次打开安卓手机,那熟悉的界面总是让人眼前一亮?今天,就让我带你一起探索安卓系统那些让...
安卓平板7.0系统好吗,智能生... 你有没有想过,拥有一台运行着最新安卓7.0系统的平板电脑,会是怎样的体验呢?想象手指轻轻滑过屏幕,流...
安卓手机换联想系统,深度体验联... 你有没有想过,你的安卓手机换上联想系统后,会发生哪些奇妙的变化呢?想象原本熟悉的界面突然焕然一新,是...
刷安卓系统的工具,轻松实现系统... 你有没有想过,你的安卓手机是不是也能像电脑一样,装上各种有趣的系统呢?没错,今天就要来聊聊这个神奇的...
机械革命安卓系统设置,个性化定... 机械革命安卓系统设置全解析在当今这个数字化时代,智能手机已经成为我们生活中不可或缺的一部分。它不仅仅...
安卓监管系统有哪些,技术手段与... 你知道吗?随着智能手机的普及,安卓系统已经成为了全球最受欢迎的操作系统之一。但是,你知道吗?为了让这...
安卓系统更新知乎,畅享智能生活... 你有没有发现,你的安卓手机最近是不是总在提醒你更新系统呢?别急,别急,今天就来给你好好聊聊这个话题。...
安卓手机系统铃声目录,个性化音... 你有没有发现,每次拿起安卓手机,那熟悉的铃声总是能瞬间唤醒你的注意力?今天,就让我带你一起探索一下安...
安卓系统修改开机画面,安卓系统... 亲爱的手机控们,你是否厌倦了每次开机时看到的那张千篇一律的开机画面?想要给你的安卓手机来点新鲜感?那...
安卓系统隐私密码,守护个人隐私... 你有没有想过,你的安卓手机里藏着多少秘密?那些聊天记录、照片、支付信息,全都在那里静静地躺着,等着被...
8848是安卓什么系统,搭载安... 你有没有想过,你的手机里那个高大上的8848手机,它到底是用的是什么操作系统呢?别急,今天就来给你揭...
安卓刷windowsxp系统下... 你有没有想过,让你的安卓手机瞬间变身成一台Windows XP电脑呢?没错,就是那个经典的操作系统!...
插画安卓系统推荐哪个,插画风格... 你有没有想过,手机里的插画风格也能成为个性展示的一部分呢?想象你的手机界面就像是一幅精美的画作,是不...
安卓系统怎么升级cpu,解锁性... 亲爱的安卓用户们,你是否也和我一样,对手机性能的提升充满了期待?想要让你的安卓手机跑得更快,升级CP...
安卓系统的烹饪游戏,指尖上的美... 你有没有想过,在忙碌的生活中,也能来点不一样的乐趣呢?比如说,在安卓系统上玩一款烹饪游戏,既能放松心...
安卓系统及应用开发,Andro... 你有没有想过,为什么你的手机里那么多好玩的应用?为什么它们能那么智能地为你服务?这背后,可是有着一套...
安卓系统预装软件封装,安卓系统... 你有没有发现,每次拿到新手机,安卓系统里总有一些我们平时不太会用到的软件?这些软件就像是被精心包裹的...
腾讯的安卓定制系统,打造专属智... 你知道吗?在手机操作系统这个江湖里,腾讯可是个低调却又实力派的大侠。他们家的安卓定制系统,就像是他们...
安卓系统所占的内存,揭秘内存占... 你有没有发现,你的安卓手机越来越慢了?是不是觉得内存不够用,打开个应用都卡得要命?别急,今天就来跟你...