寻找单模序列的顶点

问题:

令A[1..n]是一个由n个数所组成的数组。序列A[1], A[2], … , A[n]被称为是单模的(unimodal),当且仅当存在顶点序号1≤p≤n,使得数组的元素从A[1]、A[2]开始到A[p]单调增加,而从A[p]、A[p+1]开始到A[n]则单调下降。
对于一个给定的单模序列A[1], A[2], … , A[n],请找出其顶点序号p。设计一个求解此问题的算法并分析其最坏时间复杂性。

算法设计:

1.最简单易懂无非就是顺序便利整个序列,判断是否为递减并结束遍历。

2.分治算法:

  我们可以将序列分为两部分,其中我们发现序列的前一部分是单调递增,后一部分是单调递减。所以我们将序列从中间分为两部分(i=(1+n)/2),根据A[i-1],A[i],A[i+1]的值判断定点在哪一部分,然后进行递归调用。

伪代码:

find(int a,int b){
    int i=(a+b)/2;
    if((A[i]-A[i-1]>0)  && (A[i+1] -A[i]>0))
            find(i,b);
    else if((A[i]-A[i-1]<0)  && (A[i+1] -A[i]<0))
            find(a,i);
    else return i;

最坏时间复杂度:

  算法的深度为logn,在最坏的情况下,则算法遍历到最下面一层,每层只需判断中点处的情况则总复杂度为0(log n)。

转载于:https://www.cnblogs.com/cqblogs/p/7731909.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值