寻找单模序列的顶点

问题:

令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)。

posted @ 2017-10-25 19:44  16061176  阅读(167)  评论(0编辑  收藏  举报