• 非线性二分查找算法——一个突发奇想


    前言

    线性二分查找在查找目标数据的时候,每次都是进行二等分取区间。但是,当出现某种极端的情况时,这种查找就会显得比较低效。

    本文将古典概率模型与线性二分查找算法结合,希望找到一种高效的非线性二分查找算法。

    算法思想

    我们认为,在每一次进行二分时,前面的二分方式,对本次二分是有影响的。举例来说,在进行一次二分查找时,在此之前查找的结果是【‘左’,‘左’,‘左’】亦或者【‘右’,‘右’,‘右’】。在这两种情形下,前者目标点靠近左端点的概率大幅增加,而后者目标点靠近右端点的概率大幅增加。另外一种情况是【‘左’,‘右’,‘左’,‘右’,‘左’,‘右’】,这说明目标点在下一次二分时,靠近两端的可能性并没有差别。还有一种情况是【‘左’,‘右’,‘左’,‘左’,‘左’】,这说明目标点在下一次二分时,靠近左端点的可能性大幅增加。

    由此我们认为,在进行二分时,仅前面连续同符号的分类方式对下一次二分查找有影响。当前面连续同符号的分类方式不止一次时,下一次二分查找便不再采用等分的方式,而是向相应的端点靠近选取。

    非线性二分点的确定

    假设二分查找的总区间为mn,经过K次查找之后,下一次查找的区间为mq,下一次的二分点假设是p点,x0是的目标点。

     

    我们希望二分点的位置p,使点x0落在mp段与pq段的概率相等。即:

    P(x0 in mp | 前K次分类) = P(x0 in pq | 前K次分类)

    而我们认为,只有前面连续同符号的分类方式对下一次二分查找有影响,因此应该为:

    P(x0 in mp | 前K次连续同符号分类) =P(x0 in pq | 前K次连续同符号分类)

    概率推导

    经典的投币问题中,一个硬币连续出现n次,都是某一指定的面,那么这种情况出现的概率为(1/2)^n。

    我们根据古典概率进行类推,前K次均为某一指定侧时,这种情况出现的概率为:

    P(前K次均为某一指定侧) = (1/2)^K

    为满足P(x0 in mp | 前K次连续同符号分类) = P(x0 in pq | 前K次连续同符号分类),不妨设前K次连续同符号分类均为“左”,因此x0 应满足:

    P(x0 in mp | 前K次连续同符号分类) = [1 - (1/2)^K] * mp = 0.5

    P(x0 in pq | 前K次连续同符号分类) = (1/2)^K * pq = 0.5

    简化取代方法

    令 α = 本次分类前,连续同符号的分类方式次数

    当α = 1时,即下一次分类并没有偏向,仍然采用等分的方式;

    当α = 2时,我们将区间段划分为三等分段,选取α偏向的那一侧的等分点作为下一次二分点;

    如下类似进行。

  • 相关阅读:
    C语言I博客作业02
    C语言I博客作业06
    C语言I—2019秋作业第一周作业
    C语言I博客作业09
    C语言I博客作业07
    C语言I博客作业08
    利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码
    java 双因素认证(2FA)TOTP demo
    java File读取文件始终不存在的问题分析
    exchange 2010 的两个错误
  • 原文地址:https://www.cnblogs.com/yimengtianya1/p/10448436.html
Copyright © 2020-2023  润新知