查找算法-4种常用的查找算法
文章目录
- 一、查找算法是什么?
- 查找算法简介
- 二、查找算法介绍及实现
- 1.顺序查找
- 算法描述
- 代码实现:
- 2.二分查找/折半查找
- 算法描述
- 代码实现:
- 3.插值查找
- 算法描述
- 代码实现:
- 4.斐波那契查找
- 算法描述
- 代码实现:
一、查找算法是什么?
查找算法简介
- 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算
- 比较常见的有顺序查找(线性查找)
- 二分查找/折半查找
- 插入查找
- 斐波那契(黄金比例)查找
二、查找算法介绍及实现
1.顺序查找
算法描述
- 对数据进行逐一对比
- 检索到指定数据,则停止检索,返回其下标
代码实现:
package com.lingo.search;/*** 线性查找/顺序查找 最基本最基础的循环查找 也是效率最低的查找方式*/
public class SequentialSearch {public static void main(String[] args) {int[] arr = {1, 5, 8, 66, 55, 1, 2, 33, 555, 156, 498, 512, 223, 156};int result = sequentialSearch(arr, 555);System.out.println(result);}public static int sequentialSearch(int[] arr, int value) {for (int i = 0; i < arr.length; i++) {if (value == arr[i]) {return i;}}return -1;}}
输出结果:
8
2.二分查找/折半查找
算法描述
- 进行二分查找或折半查找的前提是当前数组一定是有序的
- 取出数组的中间值:mid = left + (right - left)/2
- 这里为什么不直接用left+right呢?(可能会存在数据大小越界问题)
- 若待查找数据小于中间值 则向左递归查询
- 若待查找数据大于中间值 则向右递归查询
- 最终返回待查找数据的下标,若无数据则返回-1
代码实现:
package com.lingo.search;public class BinarySearchT {private static int search(int[] arr, int left, int right, int value) {//递归中止条件if (left > right) {return -1;}int mid = left + (right - left) / 2;if (value < arr[mid]) {return search(arr, left, mid, value);} else if (value > arr[mid]) {return search(arr, mid + 1, right, value);} else {return mid;}}public static int search(int[] arr, int value) {return search(arr, 0, arr.length - 1, value);}public static void main(String[] args) {int[] arr = {1, 5, 8, 15, 55, 212, 333, 411, 555};int result = search(arr, 333);System.out.println(result);}}
输出结果:
6
3.插值查找
算法描述
- 插值查找相当于是二分查找的一个plus版本
- 插值查找的mid是一个自适应的mid
- mid = low + (high - low)*(value-arr[low])/(arr[high] - arr[low])
- 其他算法流程同二分查找
代码实现:
package com.lingo.search;public class InsertionSearchT {private static int search(int[] arr, int left, int right, int value) {//递归中止条件if (left > right) {return -1;}//这里如果不加判断会导致空指针异常if (value > arr[arr.length - 1] || value < arr[0]) {return -1;}int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);if (value < arr[mid]) {return search(arr, left, mid, value);} else if (value > arr[mid]) {return search(arr, mid + 1, right, value);} else {return mid;}}public static int search(int[] arr, int value) {return search(arr, 0, arr.length - 1, value);}public static void main(String[] args) {int[] arr = {1, 5, 8, 15, 55, 212, 333, 411, 555};int result = search(arr, 212);System.out.println(result);}}
输出结果:
5
4.斐波那契查找
算法描述
- 黄金比例
- 斐波那契数列{1,1,2,3,5,8,13,21,34,55,…}
- 斐波那契数列的特点是从第三位开始 数值等于 前两位数值的加和
- 正是采用这种思想将待排序数组的数量对应于大于或等于该数组数量且最接近的数值,然后copyOf到新数组
- 将新数组中大于原数组长度的数值更新为原数组的最大值
- mid = low + F[k-1] - 1
- 因为F[k]为数组长度 F[k-1]为左侧元素数组 F[k-2]为右侧元素数组
- 这里的-1 是因为数组的下标从0开始
- 这里采用了迭代的查找
代码实现:
package com.lingo.search;import java.util.Arrays;public class FibonaciiSearchT {private static int maxSize = 20;public static int search(int[] arr, int value) {if (arr[0] > value || arr[arr.length - 1] < value) {return -1;}int[] f = getFibonaciiArr();int low = 0;int k = 0;//斐波那契数列下标int high = arr.length - 1;while (high > f[k]) {k++;}int[] copyArr = Arrays.copyOf(arr, f[k]);for (int i = high + 1; i < copyArr.length; i++) {copyArr[i] = arr[high];}while (low <= high) {int mid = low + f[k - 1] - 1;//下标0开始if (value > copyArr[mid]) {//f[k] = f[k-1]+f[k-2]low = mid + 1;k -= 2;} else if (value < copyArr[mid]) {high = mid - 1;k -= 1;} else {if (mid <= high) {return mid;} else {return high;}}}return -1;}private static int[] getFibonaciiArr() {int[] f = new int[maxSize];f[0] = 1;f[1] = 1;for (int i = 2; i < maxSize - 1; i++) {f[i] = f[i - 1] + f[i - 2];}return f;}public static void main(String[] args) {int[] arr = {1, 5, 8, 15, 55, 212, 333, 411, 555};int result = search(arr, 212);System.out.println(result);}}
输出结果:
5
查找算法-4种常用的查找算法相关推荐
- 总结几种常用的安全算法
本文简单总结几种常用的安全算法 摘要算法 对称加密算法 非对称加密算法 数字签名 数字证书 web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 数字摘要 实现 将任意长 ...
- 算法总结---最常用的五大算法(算法题思路)
算法总结---最常用的五大算法(算法题思路) 一.总结 一句话总结: [明确所求:dijkstra是求点到点的距离,辅助数组就是源点到目标点的数组] [最简实例分析:比如思考dijkstra:假设先只 ...
- 算法基础:常用的查找算法知识笔记
1.查找表和查找效率的概念 查找表是指由同一类型的数据元素构成的集合.分为静态查找表和动态查找表. 1.1 静态查找表 1.查询某个特定元素是否在查找表的集合当中 2.查询某个特定元素的各种属性 1. ...
- 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...
- 7 种常用的排序算法直观感受
1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序 ...
- 几种常用的排序算法之JavaScript实现
文章目录 插入排序 二分插入排序 选择排序 选择排序 冒泡排序 快速排序 堆排序 归并排序 桶排序 计数排序 插入排序 <html> <script> /* 1)算法简介插入排 ...
- 视觉直观感受7种常用的排序算法
1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...
- 几种常用的经典算法(转载)
分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
- 视觉直观感受 7 种常用的排序算法
2019独角兽企业重金招聘Python工程师标准>>> 1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较 ...
最新文章
- Android架构纵横谈之二—基于性能的考虑(1)
- WPF 浏览PDF 文件
- arduino 操纵杆_用Arduino做一台FPV(第一人称视角)遥控履带车
- Vista开发之旅:微软开发技术20年回顾
- lnmp下mysql创建新用户授权后登录报错 1045 Access denied for user 'name'@'localhost
- 原子动作检测 A Better Baseline for AVA
- c++ 应输入表达式_【C语言编程入门系列】—— 第五章,C语言基本运算和表达式(一)...
- 计算机管理员英文是什么,超级管理员,超级管理员是什么,超级管理员英文 | 帮助信息-动天数据...
- 中兴网络设备交换机路由器查看ARP表项命令方法
- Unity2D中逐帧动画的制作
- 跟着小马哥学系列之 Spring AOP(Pointcut 组件详解)
- 痛心:三天痛别八位院士!中科院院士、著名药学家蒋华良英年早逝,终年57岁...
- 重启oracle服务后无法连接,解决oracle服务器重启之后连接报错的问题
- Paper reading (八十六):Normalization of the microbiota in patients after treatment for colonic lesions
- [全程建模]关于UML与新概念名词的问题讨论
- MATLAB retinex的图像去雾系统
- Cucumber Rerun Formatter
- word中两端对齐之后文字之间空格很大
- C#操作IE浏览器(打开url、获取浏览器地址栏的地址、模拟百度搜索)
- 2019年全国大学生电子设计大学(D 题)简易电路特性测试仪(1)整题思路方案分析