算法-01-二分查找/插值查找
一.顺序查找
在链表中常用,适合用来解决小规模数据,比较灵活简便。当数据较多时非常不推荐,查询速度非常慢。
二. 二分查找
2.1 二分查找简介:
通过将一组有序数据不断地分成两部分以缩小查询区间的查询方法
使用条件:数据有序
2.2二分查找的特点:
二分查找法优点是比较次数少,查找速度快,平均性能好,占用系统内存较少
2.3 二分查找的查询方式及其原理:
二分查找的查询步骤:
步骤一:检查表中间数据是否是目标数据,不是则继续向下执行
步骤二:利用中间位置记录将表分成前、后两个子表,如果中间位置记录的数据大于目标数据,则查找前一子表,否则查找后一子表
步骤三:重复以上过程,直到找到满足条件的数据,或直到子表不存在为止,则查找不成功
二分查找的查询原理:
下面举一个简单的例子,和此例的查找过程的流程图
问题:
一个含有10个元素的有序数组Array
Array的元素为:2,3,9,15,30,42,47,53,86,100
查找Array数组,确定47是否在数组中,若在数组中,返回其在数组中的位置
二分法查找过程:
2.4 二分查找实现:
方式一:使用while循环实现
template <typename Type>
int ArrayList<Type>::BinarySearch(Type x) {int min = 0;int max = currentsize;int mid = min + (max - min) / 2;cout << mid << endl;//注意这里是小于等于,没有等于号会出现重大错误while (min <= max){if (elements[mid] == x) {cout << "目标元素是顺序表中的第" << mid+1 << "个元素" << endl;return mid;} else if (elements[mid] < x) {min = mid + 1 ;mid = min + (max - min) / 2;cout << mid << endl;}else if (elements[mid] > x) {max = mid - 1 ;mid = min + (max - min) / 2;cout << mid << endl;}}cout << "目标元素不在顺序表中" << endl;return -1;}
测试方法即执行结果:
int main() {//定义一个顺序表ArrayList<int> test(7);//创建一个有序数组int array[7] = {1,2,3,4,5,6};//将数组中的值拷贝到顺序表中for (int i = 0; i < 6; i++){test.Insert(array[i],i);}test.Print();//分别查询3,6,1,5,4test.InterpolateSearch(3);test.InterpolateSearch(6);test.InterpolateSearch(1);test.InterpolateSearch(5);test.InterpolateSearch(4);//程序暂停cin.get();return 0;
}
执行结果:
方式二:使用递归实现
template <typename Type>
int ArrayList<Type>::BinarySearch(Type x,int min,int max) {int mid = min + (max - min) / 2;if(elements[mid] == x){cout << "目标元素是顺序表中的第" << mid+1 << "个元素" << endl;return mid;}else if(elements[mid] < x){BinarySearch(x ,mid+1 ,max);}else if(elements[mid] > x){BinarySearch(x ,min ,mid-1);}cout << "目标元素不在顺序表中" << endl;return -1;}
三. 插值查找
在二分查找的基础上做了改进,比二分查找的速度更快
3.1 插值查找对二分查找的改进:
二分查找是每次将目标区域缩小二分之一,而插值查找通过修改比例,每次查找将目标区域缩小缩小了更多
插值查找在实现方式上与二分查找的不同体现在mid中值的确定方面:
二分查找:
mid = min + (max - min) / 2;
插值查找:
mid = min + (max - min)*1.0*(x - elements[min]) / (elements[max] - elements[min]);
注意:由于C/C++的int类型的截断取整特性,所以在乘以比例之前先要乘以浮点数1.0
3.2 插值查找的循环方式实现:
//插值查找
template <typename Type>
int ArrayList<Type>::InterpolateSearch(Type x) {int min = 0;int max = currentsize;int mid = min + (max-min)/2;cout << mid << endl;while (min <= max){if (elements[mid] == x) {cout << "目标元素是顺序表中的第" << mid + 1 << "个元素" << endl;return mid;}else if (elements[mid] < x) {min = mid + 1;mid = min + (max - min)*1.0*(x - elements[min]) / (elements[max] - elements[min]);cout << mid << endl;}else if (elements[mid] > x) {max = mid - 1;mid = min + (max - min)*1.0*(x - elements[min]) / (elements[max] - elements[min]);cout << mid << endl;}}cout << "目标元素不在顺序表中" << endl;return -1;
}
算法-01-二分查找/插值查找相关推荐
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
- Java数据结构之二分查找/插值查找/斐波那契查找
目录 一.简单的线性查找 1.问题引出 2.代码实现 二.二分查找算法 1.基本介绍 2.代码实现(递归) 3.代码实现(非递归) 4.二分查找的功能完善 三.插值查找 1.简单介绍 2.代码实现(递 ...
- Python查找算法(三)------ 插值查找
算法简介 插值查找时根据要查找的关键字key与查找表中最大最小记录的关健字比较后的查找方法. 其核心就在于插值的计算公式: (key-a[low])/(a[high]-a[low])*(high-lo ...
- 理论基础 —— 查找 —— 插值查找
[概述] 以查字典为例,在英文字典中查 "apple" 时,下意识的会翻开前面的书页,当查 "zoo" 时,下意识的翻开一定是后面的书页,显然,此时还绝对不是从 ...
- (二)Java算法:插值查找
目录 一.简介 1.1.特点 二.maven依赖 三.实现 3.1.代码实现 3.2.数据流向过程 3.3.数据查找流程 结语 一.简介 1.1.特点 插值查找,有序表的一种查找方式.插值查找是根 ...
- C++实现插值查找(附完整源码)
实现插值查找 插值查找 插值查找C++算法完整源代码如下 插值查找 有序表的一种查找方式.插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法.插值查找基于二分查找,将查找点的选择改进 ...
- c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...
数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...
- java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...
- 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)
1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...
- 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找
第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...
最新文章
- java opencv4.40图片实现人脸识别(2)
- LA3942字典树+递推
- 【Groovy】编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )
- Django层级模型定义及序列化嵌套的方法
- python空格_python 空格
- Nginx的Gzip模块配置指令(三)
- Vue3究竟好在哪里 等推荐
- ubuntu 16.04系统中nvidai、cuda、cudnn安装及注意事项
- 阿里云ECI如何6秒扩容3000容器实例?
- 企业实战_01_Redis下载/安装/运行/停止
- java成员内部类_Java中的内部类(二)成员内部类
- 开课吧课堂:Kubernetes集群环境常见问题解决
- 华为od德科面试数据算法真题解析-专栏必看-
- PostgreSQL 命令行客户端 psql 使用指南
- 前端导出 xlsx文件
- MBR 与 GPT - 分区时要知道的事情
- 凡诺CMS一处文件包含漏洞
- Sue Shallow
- 5.12 按照多个条件进行组合排序 [原创Excel教程]
- 治具 ,手顺 是外来词,他们的含义
热门文章
- 语义分割模型架构演进与相关论文阅读
- ORB_SLAM2探秘 第三章 LoopClosing线程
- 李宁院士二审宣判,改判10年
- day042 css 选择器
- 初触Python,关于pyquery解析html(百度贴吧)
- HBase与Zookeeper数据结构查询
- 这些话,是乔布斯给世间留下的真正伟大礼物
- [javascript] 完全开源,开心分享 HTML5 Canvas 在线图片处理《imageMagic》(single page app)开发详解[1]...
- SysUtils.Trim、SysUtils.TrimLeft、SysUtils.TrimRight - 删除空格
- 微软向开源社区开绿灯 开放Web服务规范专利[转载]