常见算法(一)
创始人
2025-05-31 08:14:32
0

目录:

 (1)基本查找

(2) 二分查找

(3)插值查找 

 

 

 

(1)基本查找

 基本查找:就是有一堆数据,我要查找某个数据在这个里面到底存不存在?首先我们定义一个容器数组或者集合,把数据都放到容器当中,然后从零索引位置一个一个的往后找

java代码:

 

 

 

(2) 二分查找

 

 ...

 中间等于(0+7)/2=3.5  等于3 3位置的数据81和79相比,大于79,所以去掉右边大于81的数据

min位置不变,max等于mid-1,重新计算mid的值(1+2)/2=1 1位置的数据23和79相比小于79做掉min左边的数据,把min往右移min=mid+1,重新计算mid进行相比 

 通过再次计算79=79

 

当元素不存在时:当147还是小于150,这个时候程序还会认为要查找的元素还在右边,此时min在往右加一,这个时候min跑到max的右边,此时就是结束条件,认为不存在

 

 二分查找相关代码:

 

 

 

 

(3)插值查找 

 二分查找的改进:插值查找:它的要求是数组里面的数据分布比较均匀

在介绍插值查找之前,先考虑一个问题:

​ 为什么二分查找算法一定要是折半,而不是折四分之一或者折更多呢?

其实就是因为方便,简单,但是如果我能在二分查找的基础上,让中间的mid点,尽可能靠近想要查找的元素,那不就能提高查找的效率了吗?

二分查找中查找点计算如下:

mid=(low+high)/2, 即mid=low+1/2*(high-low);

我们可以将查找的点改进为如下:

mid=low+(key-a[low])/(a[high]-a[low])*(high-low),

这样,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。

**细节:**对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。

代码跟二分查找类似,只要修改一下mid的计算方式即可。

 

 第二种改进方式:

在介绍斐波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念——黄金分割。

黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。

0.618被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用。因此被称为黄金分割。

在数学中有一个非常有名的数学规律:斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…….

(从第三个数开始,后边每一个数都是前两个数的和)。

然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术中。

基本思想:也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。

斐波那契查找也是在二分查找的基础上进行了优化,优化中间点mid的计算方式即可

 

public class FeiBoSearchDemo {public static int maxSize = 20;public static void main(String[] args) {int[] arr = {1, 8, 10, 89, 1000, 1234};System.out.println(search(arr, 1234));}public static int[] getFeiBo() {int[] arr = new int[maxSize];arr[0] = 1;arr[1] = 1;for (int i = 2; i < maxSize; i++) {arr[i] = arr[i - 1] + arr[i - 2];}return arr;}public static int search(int[] arr, int key) {int low = 0;int high = arr.length - 1;//表示斐波那契数分割数的下标值int index = 0;int mid = 0;//调用斐波那契数列int[] f = getFeiBo();//获取斐波那契分割数值的下标while (high > (f[index] - 1)) {index++;}//因为f[k]值可能大于a的长度,因此需要使用Arrays工具类,构造一个新法数组,并指向temp[],不足的部分会使用0补齐int[] temp = Arrays.copyOf(arr, f[index]);//实际需要使用arr数组的最后一个数来填充不足的部分for (int i = high + 1; i < temp.length; i++) {temp[i] = arr[high];}//使用while循环处理,找到key值while (low <= high) {mid = low + f[index - 1] - 1;if (key < temp[mid]) {//向数组的前面部分进行查找high = mid - 1;/*对k--进行理解1.全部元素=前面的元素+后面的元素2.f[k]=k[k-1]+f[k-2]因为前面有k-1个元素没所以可以继续分为f[k-1]=f[k-2]+f[k-3]即在f[k-1]的前面继续查找k--即下次循环,mid=f[k-1-1]-1*/index--;} else if (key > temp[mid]) {//向数组的后面的部分进行查找low = mid + 1;index -= 2;} else {//找到了//需要确定返回的是哪个下标if (mid <= high) {return mid;} else {return high;}}}return -1;}
}

相关内容

热门资讯

java使用tess4j进行图... java使用tess4j进行图片文字识别一、简介二、使用过程1.maven依赖引入pom.xml2....
“躬耕乐道”的意思 “躬耕乐道”的意思 成语拼音: [gōng gēng lè dào] ...
“铭刻心骨”的意思 “铭刻心骨”的意思 成语拼音: [míng kè xīn gǔ] ...
“珍藏密敛”的意思 “珍藏密敛”的意思 成语拼音: [zhēn cáng mì liǎn] ...
“上陵下替”的意思 “上陵下替”的意思 成语拼音: [shàng líng xià tì] ...
黑马程序员——前端HTML5+... 黑马程序员——前端HTML5+CSS3(女神版)——day04—...
Android 解包paylo... 解析payload.bin获取.img文件 payload.bin payload.bin是Andr...
回答网友提出的一些问题集合(2... 本文汇总了最近一些网友提出的问题,对于这些问题,博主都是根据自己的经验进...
“七擒七纵”的意思 “七擒七纵”的意思 成语拼音: [qī qín qī zòng] ...
睚眦必报的历史典故 睚眦必报的历史典故  睚眦必报,汉语成语,出自《史记·范雎蔡泽列传》:“一饭之德必偿,睚眦之怨必报。...
“翘辫子”的意思 “翘辫子”的意思 成语拼音: [qiào biàn zǐ] ...
有关猴的成语   猴年马月:猴、马:十二生肖之一。泛指无可指望的未来岁月。也作“驴年马月”、“牛年马月”。  猴头...
SpringBoot 集成 S... 一、MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,...
“粗通文墨”的意思 “粗通文墨”的意思 成语拼音: [cū tōng wén mò] ...
“蜗角之争”的意思 “蜗角之争”的意思 成语拼音: [wō jiǎo zhī zhēng] ...
“诱掖后进”的意思 “诱掖后进”的意思 成语拼音: [yòu yè hòu jìn] ...
“好善嫉恶”的意思 “好善嫉恶”的意思 成语拼音: [hǎo shàn jí è] ...
JDBC JDBC详解 JDBC通过Java代码来操作数据库。 实际工作中大部分数据库操作都是通过代码来...
自定义Vue颜色选择器 需求是新建标签,并且带上颜色,项目用的是ant-design组件库&#x...
uniapp 微信小程序多环境... 前后端分离开发模式中,无论前后端都有可能区分不同的环境配置,开发环境&#...