寻找单模序列的顶点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找单模序列的顶点相关的知识,希望对你有一定的参考价值。
问题:
令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)。
以上是关于寻找单模序列的顶点的主要内容,如果未能解决你的问题,请参考以下文章