题记:
小文简单概述传统二分法及其应用,重点介绍其扩展:区间二分,二维及多维二分 !
概要:
0 排序与查找算法概述
1 传统二分法及其应用
2 区间二分法
3 二维二分
4 多维二分
5 总结
注1:转载请注明出处,小文由"nodexy"业余撰写;尊重原创,网络主张开放与分享并不等于忽略原作者,拒绝李彦宏!
注2:本文某些术语可能与他人习惯有所差别,但不影响主旨含义的领会,敬请谅解。
正文:
0 排序与查找算法概述
对于计算机科班出身者,数据结构与算法一定是学过的 ,排序与查找算法也一定是接触过的,考试必考的,项目必用的!关于常见排序与查找算法的基本原理讲解等知识,请参考高校教材!笔者只是找一个开头的话题,交代清楚背景。
算法特征:有穷性,确定性,可行性,输入,输出
算法描述:自然语言表述,伪代码,流程图
常见排序算法:插入,选择,冒泡,快速 - 改进版本等:TimSort 等
常见算法设计方法:枚举,回溯,递归,递推,迭代
查找算法:顺序查找,二分查找,哈希查找,二叉排序树查找
注: 概念性的东西要条理清楚,否则至少说明你在学校并不用心;比如我在面试过程中,如果遇到自称学习成绩优异的学生,会问“哈夫曼树和最优二叉树是不是同一种树?”
1 传统二分法及其应用
我们这里所讲的二分法,仅指查找算法中的二分查找法,而非其他领域的二分法(如 求函数零点近似值的二分法,又如 爱利亚学派芝诺四大著名悖论之一“证明运动是不可能的”的二分法)。
典型二分法的原理及其最小应用场景如下:
从一个有序(升序)数组中查找目标数值 dest:
先设置left,right分别为数组的第一个和最后一个元素值,mid 为数组中间元素值(所谓中间是以数组下标为基准);
比较查找的目标值dest是否与left,right,mid相等:是则找到,结束;否则将dest与mid相比较;
如果dest比mid大,则更新left=mid,;如果dest比mid小,则更更新right=mid;
重新计算mid,并返回上一步继续比较,直至找到dest,或者left>=right(未找到dest);
在应用方面,二分法的核心是对目标数组排序后,递归二分查找目标值!预处理的主要内容就是选择排序指标,然后排序!
需要注意的是,对于同一个有序数组,当目标值可能重复时,二分法也是稳定的,即找到的目标值下标永远不会发生变化。
2 区间二分法
所谓区间二分法,是相对于传统二分法而言的;
传统二分法可以从几何角度建模如下: 一个坐标轴上,有一系列点,从中查找目标点!
而区间二分法则是:一个坐标轴上,有一系列区间(开闭状态统一),从中查找目标点或目标子区间!
此处顺便提及下二维二分法:在一个二维坐标系上,有一系列闭合区域,从中查找目标点或目标轴区间或目标子区域!
对于区间二分法,主要考虑如下几个问题:
(1) 区间之间是否有overlap:
如果样本数据是有overlap的,则需要根据不同的查找目标做不同的处理:
如果查找点,无论是只要找到一个目标点所在区间即可,还是要找到所有目标点所在区间,都无需在预处理时做去重操作;
如果查找区间,则建议先去重,后二分;因为子区间可能跨越多个区间,或者被多个区间包含,含有oeverlap的数据会大大增加二分的复杂度。
(2) 区间是离散数据:如果区间是离散的,根据值域的大小,优先考虑是否有二分的必要:
如果值域较小,则可以声明一个全值域的0数组,然后遍历所有区间,对全值域0数组的对应下标做+1操作;之后遍历全值域数组获得目标点或目标区间。
如果值域较大,以致计算资源无法满足时,建议做二分查找。
此时离散数据的二分与连续数据二分基本相似,见下文。
(3) 区间是连续数据:
这里就是真正的区间二分法了 - 其基本原理和过程与传统二分法类似,只是在比较操作时,增加了复杂度:
a. 区间数据排序
b. 区间数据去重 - 消除overlap
c. 递归二分
d. 结果解析
e. 注意事项
3 二维二分
所谓二维二分,其实就是二维平面的区间二分,在两个轴向上先后分别做区间二分!几何视角描述见上一节“2区间二分法”。
通用的做法就是先对X轴做二分,锁定Y轴上的备选区域,然后根据数量级考虑是继续二分还是直接枚举比较。
4 多维二分
多维二分术语二维二分的扩展!这一点相信中学数学里经常会看到,一个法制或规律,从1到2之后,往往会做扩展,放到全集上去检验其各种特性。
当然,如果真的面对高维数据时,需要根据具体场景来选择方法;因为二分法并不是万能的,高维数据也有自身的特性。比如3维数据,可能还可以先后做3个维度的3次二分
,但如果是16维,32维,则可能不太适合了。
5 总结
列举了这么多,相信你一定会纳闷: 到底在哪些场合会遇到这么变态的问题呢?
其实,在应用领域,经常会碰到类似的问题:
比如Bioinformatics里的DNA序列上目标元件定位等,比如 GIS的目标区域定位,
及其宏观经济学领域和金融领域的一些目标值查找,以及BI领域的某些场景。
总的来说,一个基础方法或算法,如果你深谙其道,其实很容易触类旁通,扩展到更广泛的领域。
注:图示请参考: https://cacoo.com/diagrams/HQbjMFugU5vIpkbD
小文由nodexy于业余时间撰写!不妥之处,欢迎批评指正。
分享到:
相关推荐
在科学计算和工程实践中,求解非线性方程的根是一个常见的问题。对于这类问题,二分法提供了一种简单...随着计算机技术的不断进步和数值方法的不断发展,二分法及其变体仍将在未来的科学研究和工程实践中发挥重要作用。
二分法详解及其应用pdf
二分法是一种数值计算方法,常用于寻找方程的近似解,特别是在函数的零点问题上。这种方法基于函数连续性的性质,适用于解决那些不能直接解析求解的方程。在数学教学中,二分法通常在学生理解了方程根与函数零点之间...
【二分法浅析】 二分法是一种数值计算方法,常用于寻找连续函数的零点,即求解方程的近似解。这种方法基于零点存在定理,即如果一个函数在某闭区间上连续,且两端点的函数值异号,那么在此区间内至少存在一个零点。...
二分法是一种数值计算方法,常用于寻找方程的近似解,特别是在函数的零点问题上。这种方法基于函数连续性的性质,适用于解决方程f(x) = 0的情况,尤其是当f(x)在给定区间[a, b]内连续且f(a) * f(b) 时。这意味着函数...
二分法流程图1 二分法是一种常用的数值计算方法,用于寻找单变量函数的零点。它的基本思想是通过不断地将搜索范围缩小,来逼近函数的零点。下面我们将通过流程图来详细地介绍二分法的工作过程。 首先,我们需要...
除了基本的查找之外,二分法还可以扩展应用到其他问题,如求解方程的根(二分法求解根)、查找数组中的最大或最小元素、排序算法(比如快速排序和归并排序的某些阶段)等。学习和掌握二分法对于提升编程能力和解决...
1. 二分法(折半查找)及其在温度查找中的应用。 2. 热敏电阻(NTC)的工作原理和特性,如10K3435型号的电阻值与温度的关系。 3. 分压电路的设计,10千欧姆电阻作为分压电阻的作用。 4. 温度测量的范围,-40到80℃。...
以下是对二分法及其在VB中实现的详细解释。 首先,理解二分法的基本原理。假设我们有一个连续函数f(x),我们要找到这个函数的零点,即f(x) = 0的解。二分法基于以下步骤: 1. 选择一个包含至少一个零点的闭区间[a,...
在含有n个元素的有序数列中,传统二分法查找在平均和最坏情况下的时间复杂度均为O(log n),远快于线性查找的O(n)。 尽管二分法查找已经相当高效,但是在实际应用中,有序数列的特性有时可以为我们提供额外的线索。...
二分法(dichotomie) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的...
根据给定的文件信息,我们可以总结出以下关于“二分法排序算法C语言实现”的相关知识点: ### 1. 二分法搜索算法原理 二分法搜索算法,也称为折半查找算法,是一种在有序数组中查找特定元素的搜索算法。其基本思想...
MATLAB中的这些二分法程序展示了算法的灵活性和可扩展性,可以根据具体需求进行定制和优化。在使用时,用户需要根据问题的特点选择合适的版本,并注意设置适当的初始区间、精度要求和最大迭代次数。
利用java二分法来计算最靠近值,通过二分法来遍历数据,得到想要最近值
二分法,也称为折半搜索或二分搜索,是一种在有序数组中查找特定元素的搜索算法。这个方法的关键在于其高效性,每次查询都能将搜索区间减半,因此在大量数据中查找特定值时非常有效。二分法不仅用于查找,还可以应用...
二分法的使用 二分法是一种常用的数值计算方法,用于找到函数的零点或极值。在计算机科学中,二分法是解决直际问题的重要工具。下面我们将详细介绍二分法的使用和实践。 二分法的定义 二分法是一种数值计算方法,...
### 二分法及其改进 #### 一、引言 在数学及工程计算领域中,求解非线性方程的根是一项基本而又至关重要的任务。对于这类问题,传统的方法之一便是二分法。二分法因其算法简单、易于理解和实现而在实际应用中得到...
二分法
二分法,也称为折半搜索,是一种在有序数组中查找特定元素的搜索算法。它通过不断将查找区间减半,快速定位目标值。在数值分析领域,二分法也被用于求解方程,特别是连续函数的零点。在本案例中,我们将探讨如何用...