zoukankan      html  css  js  c++  java
  • 非线性二分查找算法——一个突发奇想

    前言

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

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

    算法思想

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

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

    非线性二分点的确定

    假设二分查找的总区间为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时,我们将区间段划分为三等分段,选取α偏向的那一侧的等分点作为下一次二分点;

    如下类似进行。

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/yimengtianya1/p/10448436.html
Copyright © 2011-2022 走看看