`
bluky999
  • 浏览: 720348 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

传统二分法及其扩展

阅读更多

题记: 小文简单概述传统二分法及其应用,重点介绍其扩展:区间二分,二维及多维二分 !

概要:

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于业余时间撰写!不妥之处,欢迎批评指正。

0
1
分享到:
评论

相关推荐

    二分法及其matlab程序-经典.ppt

    在科学计算和工程实践中,求解非线性方程的根是一个常见的问题。对于这类问题,二分法提供了一种简单...随着计算机技术的不断进步和数值方法的不断发展,二分法及其变体仍将在未来的科学研究和工程实践中发挥重要作用。

    二分法详解及其应用pdf

    二分法详解及其应用pdf

    浅析二分法及其Matlab和C程序实现.pdf

    二分法是一种数值计算方法,常用于寻找方程的近似解,特别是在函数的零点问题上。这种方法基于函数连续性的性质,适用于解决那些不能直接解析求解的方程。在数学教学中,二分法通常在学生理解了方程根与函数零点之间...

    浅析二分法及其Matlab和C程序实现.docx

    【二分法浅析】 二分法是一种数值计算方法,常用于寻找连续函数的零点,即求解方程的近似解。这种方法基于零点存在定理,即如果一个函数在某闭区间上连续,且两端点的函数值异号,那么在此区间内至少存在一个零点。...

    浅析二分法及其Matlab和C程序实现资料.pdf

    二分法是一种数值计算方法,常用于寻找方程的近似解,特别是在函数的零点问题上。这种方法基于函数连续性的性质,适用于解决方程f(x) = 0的情况,尤其是当f(x)在给定区间[a, b]内连续且f(a) * f(b) 时。这意味着函数...

    二分法流程图1

    二分法流程图1 二分法是一种常用的数值计算方法,用于寻找单变量函数的零点。它的基本思想是通过不断地将搜索范围缩小,来逼近函数的零点。下面我们将通过流程图来详细地介绍二分法的工作过程。 首先,我们需要...

    二分法文献和程序

    除了基本的查找之外,二分法还可以扩展应用到其他问题,如求解方程的根(二分法求解根)、查找数组中的最大或最小元素、排序算法(比如快速排序和归并排序的某些阶段)等。学习和掌握二分法对于提升编程能力和解决...

    温度转换二分法_二分法_温度二分法查表_40_

    1. 二分法(折半查找)及其在温度查找中的应用。 2. 热敏电阻(NTC)的工作原理和特性,如10K3435型号的电阻值与温度的关系。 3. 分压电路的设计,10千欧姆电阻作为分压电阻的作用。 4. 温度测量的范围,-40到80℃。...

    VB 二分法求方程根

    以下是对二分法及其在VB中实现的详细解释。 首先,理解二分法的基本原理。假设我们有一个连续函数f(x),我们要找到这个函数的零点,即f(x) = 0的解。二分法基于以下步骤: 1. 选择一个包含至少一个零点的闭区间[a,...

    改进的二分法查找

    在含有n个元素的有序数列中,传统二分法查找在平均和最坏情况下的时间复杂度均为O(log n),远快于线性查找的O(n)。 尽管二分法查找已经相当高效,但是在实际应用中,有序数列的特性有时可以为我们提供额外的线索。...

    二分法matlab程序.zip_matlab DICHOTO_matlab 二分法_matlab二分法_二分法主程序

    二分法(dichotomie) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的...

    二分法排序算法 C语言实现

    根据给定的文件信息,我们可以总结出以下关于“二分法排序算法C语言实现”的相关知识点: ### 1. 二分法搜索算法原理 二分法搜索算法,也称为折半查找算法,是一种在有序数组中查找特定元素的搜索算法。其基本思想...

    三种二分法MATLAB程序

    MATLAB中的这些二分法程序展示了算法的灵活性和可扩展性,可以根据具体需求进行定制和优化。在使用时,用户需要根据问题的特点选择合适的版本,并注意设置适当的初始区间、精度要求和最大迭代次数。

    二分法查询最近值

    利用java二分法来计算最靠近值,通过二分法来遍历数据,得到想要最近值

    二分法_二分法解方程_

    二分法,也称为折半搜索或二分搜索,是一种在有序数组中查找特定元素的搜索算法。这个方法的关键在于其高效性,每次查询都能将搜索区间减半,因此在大量数据中查找特定值时非常有效。二分法不仅用于查找,还可以应用...

    二分法的使用

    二分法的使用 二分法是一种常用的数值计算方法,用于找到函数的零点或极值。在计算机科学中,二分法是解决直际问题的重要工具。下面我们将详细介绍二分法的使用和实践。 二分法的定义 二分法是一种数值计算方法,...

    二分法的改进

    ### 二分法及其改进 #### 一、引言 在数学及工程计算领域中,求解非线性方程的根是一项基本而又至关重要的任务。对于这类问题,传统的方法之一便是二分法。二分法因其算法简单、易于理解和实现而在实际应用中得到...

    二分法的代码

    二分法

    c语言二分法递归求解函数根

    二分法,也称为折半搜索,是一种在有序数组中查找特定元素的搜索算法。它通过不断将查找区间减半,快速定位目标值。在数值分析领域,二分法也被用于求解方程,特别是连续函数的零点。在本案例中,我们将探讨如何用...

Global site tag (gtag.js) - Google Analytics