O(nlogn)中最长的非递减子序列

时间:2015-02-02 16:04:03

标签: algorithm implementation lis

这可能是在O(nlogn)中找到最长的非递减子序列的非常经典的问题。为了修改,阵列A = {2 4 2 3 3 5 1}中最长的非减少子序列的长度是5 {2 2 3 3 5}。

然而,经过无数次的努力,我无法理解我的算法实现失败的地方。我已经阅读并实现了描述HereHere的算法,只需稍微改变一下“=”符号,以允许O(nlogn)实现最长增加子序列中的相等元素。我正在尝试this问题,其中简单的O(n ^ 2)方法(这是正确的,因为解决方案被接受)和O(nlogn)方法给出不同的解决方案(我通过断言语句推断)证明了我的O(nlogn)实现肯定有问题。

我的O(nlogn)实现如下:

/* Array LNDS will be used for finding
longest non-decreasing subsequence in array A of size n */
int LNDS[n],len=1,x; // len will be storing the required length
fill(LNDS,LNDS+n,0);
LNDS[0]=A[0];
for(int i=1; i<n; i++)
{
    x=LNDS[len-1];
    if(A[i]<LNDS[0])
        LNDS[0]=A[i];
    else if(A[i]>=x) // "=" sign to allow equal elements
        LNDS[len++]=A[i];
    else
    {
        l=0;
        r=len-1;
        while(r-l>1) // binary search for finding lower bound for A[i] in LNDS
        {
            m=(l+r)/2;
            if(LNDS[m]>=A[i]) r=m;
            else l=m;
        }
        LNDS[r]=A[i];
    }
}
return len;

0 个答案:

没有答案
相关问题