首页 > 编程知识 正文

三分快三的算法公式,二分查找算法的时间复杂度

时间:2023-05-03 08:58:39 阅读:138224 作者:43

原理三分法的原理也很简单,和二分法几乎一样。 但是,我们划分区间的时候,不是把区间分成两部分,而是分成三部分。 之后,我们同样通过缩小区间来决定要寻找的值的所在。

但是,既然分成两部分就解决了问题,为什么我们要分成三部分呢?

在回答这个问题之前,让我们先看看另一个问题。 数学上,二分法到底解决了什么问题?

还记得二分法使用的前提吗? 因为数组必须为有序,所以二分法实际上解决了单调函数的求解问题。 只要数组是有序的,根据函数的定义,可以看作是将数组的下标映射到数组并取值的函数。 很明显,这是一个单调的函数,用二分法寻找元素v之一。 本质是搜索

请参阅。

因此,二分法中使用的场景是单调函数,也就是一次函数。 如果我要搜索二次函数的最小值,用二分法可以吗?

显然是不可能的。 因为在取得mid后,不知道答案可能出现在左右哪个区间。

这个时候需要三分法出场。

三分法将区间分为三部分。 这个我已经知道了。 分成三部分,当然需要两个端点。 这两个端点各有一个值,分别称为m1和m2。 我们要的是函数的最小值,所以我们必须考虑极值接近。

但是,我们有两个中间点。 应该怎么逼近呢?

从函数图像直接分析,从上面的图中可以看出,m-1和m-2的函数值与它们的极值点的距离有关。 离极值点越近,函数值越小(根据函数的不同也可能会变大)。 在上图中,

因此,m2接近极值点。 我们缩小区间接近极值点,所以我们

这里有点问题。 如何确保极值点在m2和m1之间? 万一在m2的右侧怎么办?

我们试着画图像,这种情况其实没有区别,我们只是放弃区间

对极值点没有影响。

极值点在m1的左侧吧? 这是不可能的。 因为如果极值点位于m1的左侧,则m2必须离极值点比m1远。 在这种情况下,m2中的函数值不能小于m1。

也就是说,三分法的精髓是每次通过比较两个值的大小,缩小三分之一的区间。直到最后区间的范围小于我们设置的阈值为止

过程

使用两个要点将其分为三个段。 midl=left (写左)/3; MIDR=right-(right-left )/3; 如果midl比midr更接近最高值,则right=midr- 1; 【舍弃分离的段】当midr比midl更接近罪孽的推翻时,left=midl 1; 【舍弃分离段】假如是取最大值,则midr和midl中谁大谁更靠近最终的结果,于是最终选择的区间一定要包含较大者;同样取最小值也是这样的,即:

f(m1 ) f ) m2 )的情况下,表示极值点位于[m1,r]区间内,可以不考虑[l,m1]区间; 如果f(m1 ) f ) m2 )表示极值点位于[l,m2]区间内,则不需要考虑[m2,r]区间,各次迭代将搜索范围限制为原来的2/3,直到最终接近极值点。 也就是说,l和r之差接近无限小。 三点搜索的时间复杂度如下:

t(n )=t ) 2n/3 )1=o ) ) log3n ) )。

代码实现privatestaticinttrisection _ search (int [ ] arr ) if ) arr==null ) { return -1; (} int left=0; int right=arr.length - 1; wile(left=right({intmidl=left ) right-left )/3; intmidr=right-(right-left )/3; arr [ midl ]==arr [ midr ] ) { return midl; }elseif(arr[midl]arr[midr] ) { right=midr - 1; }else { left=midl 1; } } return -1; } public class TreeNode { //数组中没有重复元素的privatestaticinttrisection _ search (int [ ] arr ) if(arr==null ) { return -1 (} int left=0; int right=arr.length; while(leftright ) int midl=left (right-left )/3; intmidr=right-(right-left )/3; arr [ midl ] arr [ midr ] ) { right=midr - 1; }else{ left=midl 1; } }返回左; } publicstaticvoidmain (string [ ] args (intarr )={ 1,2,5,7,11,14,16,17,20,22,25,28,30,33,intintin if(index==-1 ) { System.out.println ('找不到); }else{ System.out.println ('索引' index '的值为' arr[index] ); }}当天,通过三分搜索也可以在单调函数中查找最高值

staticboolfind (int [ ] sorted array,int number ) if ) sortedarray.length==0) return false; int start=0; int end=sortedArray.Length - 1; while(end=start ) intfirstmiddle ) end-start )/3 start; intsecondmiddle=end-() end-start )/3; 固态阵列[第一次混合]编号(if ) end=第一次混合- 1; 固态阵列[ second middle ] number (else if ) start=secondMiddle 1; else if (sorted array [ first middle ]!=numbersortedarray [ second middle ]!=number(end=secondmiddle-1; 开始=第一中间1; } else return true; } return false; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。