三分查找

三分查找模板 三分查找,用来比较不同坐标处值的大小关系(比较的这两点通常是分布在极值点两侧的),来确定区间内的极值。 三分应用于最优化问题的求解。在解题时没必要给出证明,只要知道问题不满足单调性,就可以尝试用三分搜索极值点,而且三分整数很少见,因为除非能够证明这种策略是正确的(即完全符合凸函数的性质,但是通常极值点不会在整点取得,如果三分整数,那么函数也不是连续的了),否则很可能会错误,而三分应用在小数中... 阅读详情

一. 概念

 
在二分查找的基础上,在右区间(或左区间)再进行一次二分,这样的查找算法称为三分查找,也就是三分法。
三分查找通常用来迅速确定最值。

二分查找所面向的搜索序列的要求是:具有单调性(不一定严格单调);没有单调性的序列不是使用二分查找。
与二分查找不同的是,三分法所面向的搜索序列的要求是:序列为一个凸性函数。通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足不严格单调递增(递减),右侧序列必须满足不严格单调递减(递增)。如下图,表示一个有最大值的凸性函数:

二、算法过程

(1)、与二分法类似,先取整个区间的中间值mid。
  1. mid = (left + right) / 2;    

(2)、再取右侧区间的中间值midmid,从而把区间分为三个小区间
  1. midmid=(mid+right)/2;  


(3)、我们mid比midmid更靠近最值,我们就舍弃右区间,否则我们舍弃左区间?。
比较mid与midmid谁最靠近最值,只需要确定mid所在的函数值与midmid所在的函数值的大小。当最值为最大值时,mid与midmid中较大的那个自然更为靠近最值。最值为最小值时同理。
  1. if (cal(mid) > cal(midmid))    
  2.     right = midmid;  //mid大,则一定要选择包含mid区间的  
  3. else    
  4.     left = mid;  //midmid大,则选择的区间要包含midmid  
(4)、重复(1)(2)(3)直至找到最值。
 
 
算法的正确性:
1、mid与midmid在最值的同一侧。由于凸性函数在最大值(最小值)任意一侧都具有单调性,因此,mid与midmid中,更大(小)的那个 数自然更为靠近最值。此时,我们远离最值的那个区间不可能包含最值,因此可以舍弃。
2、mid与midmid在最值的两侧。由于最值在中间的一个区间,因此我们舍弃一个区间后,并不会影响到最值
 
注:假如是取最大值,则mid和midmid中谁大谁更靠近最终的结果,于是最终选择的区间一定要包含较大者;同样取最小值也是这样的。

三、具体实现 

  1. const double EPS = 1e-10;    
  2.     
  3. double calc(double x)    
  4. {    
  5.     // f(x) = -(x-3)^2 + 2;     
  6.     return -(x-3.0)*(x-3.0) + 2;    
  7. }    
  8.     
  9. double ternarySearch(double low, double high)    
  10. {    
  11.     double mid, midmid;    
  12.     while (low + EPS < high)    
  13.     {    
  14.         mid = (low + high) / 2;    
  15.         midmid = (mid + high) / 2;    
  16.         double mid_value = calc(mid);    
  17.         double midmid_value = calc(midmid);    
  18.         if (mid_value > midmid_value)    
  19.             high = midmid;    
  20.         else    
  21.             low = mid;    
  22.     }    
  23.     return low;    
  24. }  

题目The Moving Points HDU-4717(三分查找最小值)

二分查找与三分查找算法 C# 首先是二分查找法,时间复杂度O(2log2(n)):         static bool Find(int[] sortedArray, int number)        {            if (sortedArray.Length == 0)                return false;            int start = 0; 阅读详情

相关推荐

三分查找(排序)

算法特点及适用场景三分查找是一种基于分治思想的查找算法,通过将查找区间划分为三部分,利用目标值与两个中间点对应元素值的关系来快速缩小查找范围,在特定的单调函数或者已排序数组查找场景中能发挥作用。尤其适用于一些函数求值较复杂,但具有单调性,且希望更精细地缩小查找区间以加速查找目标值的情况,比如在一些数值分析中,对具有单调性质的复杂函数查找满足特定条件的值等场景。注意事项及可能遇到的问题在代码实现方面,要注意正确计算中间点索引,避免整数溢出问题,像代码中采用和的方式来计算就是一种较好的避免溢出的写法。

m0_49844997的博客 1279

【算法与数据结构】三分查找

一. 概念 在二分查找的基础上,在右区间(或左区间)再进行一次二分,这样的查找算法称为三分查找,也就是三分法。 三分查找通常用来迅速确定最值。 二分查找所面向的搜索序列的要求是:具有单调性(不一定严格单调);没有单调性的序列不是使用二分查找。 与二分查找不同的是,三分法所面向的搜索序列的要求是:序列为一个凸性函数。通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)

beiyouyu的专栏 1万+

记一次网络风暴/网络环路

环境: win10 x64 ,联想云教室,电子教室,华三交换机。 状况描述: 最开始开机,一直卡在PXE启动界面,进不去系统。电脑技术张工说,先开教师机后开学生机。因为学生机开机需要读取教师机的镜像。但是状况依旧。 开始排查网络,重启交换机后,发现陆续有几台电脑能登陆进系统桌面了,但很慢起码过了5分钟以上才能进去。 教师机一直都是正常的,然后我在教师机部署电子教室。技术说这电子 教室与云教室IP冲突。 (那之后我查了下这两款软件的PID和端口,所占端口不一样,那没冲突) 我说不可能吧,这套软件在

Nightwish5的博客 2864

算法:三分查找算法

原理 三分法的原理也很简单,和二分法几乎一模一样,只不过我们分隔区间的时候,不是将区间一分为二,而是一分为三。之后,我们同样通过缩小区间的方法来确定要查找的值所在。 但是:既然分成两份就能解决问题,我们为什么要分成三份呢? 在回答这个问题之前,我们先来看另一个问题。在数学上,二分法究竟解决了一个什么问题? 还记得二分法使用的前提吗?数组必须是有序的,所以二分法其实解决的是单调函数的求解问题。只要数组是有序的,根据函数的定义就可以看做是一个将数组下标映射到数组取值的函数。显然,这是一个单调函数,我们通过二分法

OceanStar的博客 2万+

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 205

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上,如果试着使用C语言制作微型计算机的控制程序等,就必须使用与“普通的C程序”不同的使用方法。 作为一般的C语言的学习方法,使用“printf”“scanf”等标准函数的程序开发是固定的,但这些都是以UNIX和Windows等环境上的应用程序开发为前提的。 对此,没有显示器和键盘的嵌入式系统的微型计算机控制程序,该如何

编程老王 7975

查找算法--线性查找、二分查找和三分查找的原理及适用场景

集合查找算法 线性查找 特征:从第一个元素开始,采用逐个比较的方式进行查询,类似下图 前提:没有限制 使用场景:大部分场景,但性能低 时间复杂度: O(n) 二分查找 特征:每次取中点进行判断,待查找集合减半;线性函数;不断逼近 前提:集合必须有序 适用场景:大部分场景 实现原理: 对于一个有序序列,每次选择中间的那个元素,与欲找出的元素进行比较,若比该元素大,则查找范围变为序列的前一半;反之,若中位元素比查找元素小,则将下一次的查找范围变为序列的后一半;若中位元素与想要查找的元素相等,返回中位元素在序列

penriver的博客 1847

OpenCV 常用的API总结(迅速查询)

OpenCV基本操作 openCV安装 读取图片(IO操作) 绘制集合图形 图像加法以及混合操作 OpenCV图像处理 图像几何变换 形态学操作 图像平滑 直方图 边缘检测 模板匹配 傅里叶变换 轮廓检测 图像分割 图像特征提取 SIFT检测关键点 视频读写............

Peyzhang的博客 3935

三分搜索

三分搜索 三分搜索——分治算法 三分搜索算法的做法是:它将待查元素x与n/3处的元素比较,然后将x与2n/3处的元素进行比较。比较的结果或者找到x,或者将搜索范围缩小到原来的n/3. (1)编写C++程序实现算法; (2)分析算法的时间复杂度。 #include<iostream> using namespace std; class SortableList { private: ...

qq_44379423的博客 2800

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

7.19华为OD机试真题 新系统 - 物流仓储多维度成本利润综合查询系统 (Java/Py/C/C++/Js/Go)

7.19华为OD机试真题 新系统 - 物流仓储多维度成本利润综合查询系统 (Java/Py/C/C++/Js/Go)

算法大师! 614

三分查找算法

输入:n个元素的升序数组A[1···n]和元素x;输出:如果x=A[j],1&lt;=j&lt;=n,则输出就,否则输出0.步骤:1、先把整个区间的n/3的值lmid←n/3+ left。2、再取右侧区间的中间值rmid←lmid+right,从而把区间分为三个小区间。3、我们A[lmid]的值与x进行比较,如果相等就直接输出lmid结束算法,x比A[lmid]的值大我们就舍弃左区间进入第四步,否...

qq_35358818的博客 9883

基于STM32的智能电子秤设计毕业论文

摘要:本文设计了一款基于STM32F103C8T6的智能电子秤系统,通过HX711称重传感器实现高精度测量,采用OLED显示和矩阵键盘完成人机交互。系统包含重量采集、数据处理、单价设置、去皮清零及总价计算等功能模块,经测试测量误差小于0.1%,稳定性良好。研究实现了低成本、高可靠性的智能称重方案,为后续无线传输和AI算法集成奠定了基础。关键词:STM32;智能电子秤;HX711;OLED显示;矩阵键盘。

3254968421的博客 847

三分查找法

在算法领域,二分查找是有序序列查找的 “标杆”,但面对(如找最大值 / 最小值),二分查找便无能为力。此时,(Ternary Search)凭借其 “分而治之” 的核心思想,成为解决单峰函数极值问题的高效工具,时间复杂度同样低至 O (log n)。

Gu_yyqx的博客 1287

13、多实例任务(multi instance)

多实例任务,是指一个类型的任务需要循环执行多次,包括串行多实例任务和并行多实例任务。

leyoliu的博客 3202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二分查找&三分查找

二分查找&三分查找 二分查找(折半查找)是查找算法中一种有效的算法:输入一个有序序列(数组)和一个元素,如果该元素包含在改有序序列中,则返回其位置,若不存在,则返回**-1**(或NULL)。 二分查找的原理:对于一个有序序列,每次选择中间的那个元素,与欲找出的元素进行比较,若比该元素大,则查找范围变为序列的前一半;反之,若中位元素比查找元素小,则将下一次的查找范围变为序列的后一半;若中位...

Mr.DImple的博客 4671

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

三分查找C语言实现

三分查找C语言实现 关键词: 变参函数、函数指针、三分查找、C语言 /************************************************************************* > File Name: 2.third_search.cpp > Author: ChenXiansen > Mail: 1494089474@qq.com > Created Time: Sun 22 Nov 2020 02:30:21 PM CST

陈显森的博客 1404

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

三分查找(ternary search)及其示例

在这个博客的开头(差不多一年前的事儿了),我曾写过一篇非常潦草的文章来描述二分查找(binary search)算法。二分查找是最经典的在单调序列中查找目标值的算法,不再多费口舌了。 除了二分查找之外,其实还有三分查找(ternary search)算法。它的知名度没有二分查找那么高,但是用处也不小。一句话,三分查找用来确定函数在凹/凸区间上的极值点。什么是凹凸性呢?借用同济版《高...

LittleMagic's Blog 3329

三分查找专题

我们都知道 二分查找 适用于单调函数中逼近求解某点的值。 如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。 下面的方法应该是三分查找的一个变形。

逍遥小章 1869

关于三分查找

以凹函数为例,以下均以区间左端点认为,右端点为认为 用两个点将区间分成三份 与极值点进行比较,社戏远离最值点的一段如此不断缩小区间,直到 与近乎相等 应用 [C. Slay the Dragon](Problem - 1574C - Codeforces)本题的特点是,当数据中不存在此点时的某些情况需要比较和他相邻的点的结果,及最近的大于它和小于它的。这时候就可以用三分查找,找到此两点。......

m0_60610120的博客 746
上一篇: The Moving Points HDU - 4717 (三分查找)
下一篇: Perfect Squares (水题)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值