Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最长递增子序列[O(nlogn)]的算法是如何工作的?_Algorithm_Correctness_Lis_Proof Of Correctness - Fatal编程技术网

Algorithm 最长递增子序列[O(nlogn)]的算法是如何工作的?

Algorithm 最长递增子序列[O(nlogn)]的算法是如何工作的?,algorithm,correctness,lis,proof-of-correctness,Algorithm,Correctness,Lis,Proof Of Correctness,我发现了中提到的算法(注意:此实现假设列表中没有重复的算法): set-st; set::迭代器; 圣克利尔(); 对于(i=0;i 请先阅读我的解释。如果仍然不清楚,请阅读以下内容: 该算法为每个长度的LIS保留尽可能低的结束数。通过保持最低的数字,您可以最大限度地扩展LIS。我知道这不是一个证明,但可能对您来说是直观的。语句:对于每个I,当前集的长度等于lar的长度gest递增子序列 证明:让我们使用归纳法: 基本情况:基本正确 归纳假设:假设我们已经处理了i-1元素,并且集合的长度是LIS

我发现了中提到的算法(注意:此实现假设列表中没有重复的算法):

set-st;
set::迭代器;
圣克利尔();
对于(i=0;i

请先阅读我的解释。如果仍然不清楚,请阅读以下内容:


该算法为每个长度的
LIS
保留尽可能低的结束数。通过保持最低的数字,您可以最大限度地扩展
LIS
。我知道这不是一个证明,但可能对您来说是直观的。

语句:对于每个I,当前集的长度等于lar的长度gest递增子序列

证明:让我们使用归纳法:

基本情况:基本正确

归纳假设:假设我们已经处理了i-1元素,并且集合的长度是LIS[i-1],即第一个i-1元素可能存在的LIS的长度

归纳步骤:在集合中插入元素数组[i]将导致两种情况

  • A[i]>=set.last():在这种情况下,A[i]将是集合中的最后一个元素,因此LIS[i]=LIS[i-1]+1

  • A[i]A[i])。这是正确的。因此得到了证明


  • 解释全局。在集合中插入[i]将添加到LIS[i-1]或创建自己的LIS,这将是从第0个位置到第i个元素位置的元素。

    提示:阅读关于
    动态编程
    记忆
    ,此动态编程解决方案也是O(n*n)据我所知。@AamirKhan动态规划是一种通用的问题解决技术,根据问题和应用方式的不同,应用它可以得到时间复杂度非常不同的解决方案。例如,动态规划斐波那契是线性时间。这就是该算法的优点。它将为您提供L的正确长度是,但集合中的元素不必是构成它的元素!在这种情况下,algo将返回5作为答案,尽管集合中的元素{1,2,4,7,9}最长链长度等于反链最小覆盖的大小(Dilworth's Thorem)。可以证明,对于这个偏序集,贪婪地找到反链覆盖会产生最优解。
    set<int> st;
    set<int>::iterator it;
    st.clear();
    
    for(i=0; i<n; i++) {
    
      st.insert(array[i]); it=st.find(array[i]);
    
      it++; if(it!=st.end()) st.erase(it);
    }
    
    cout<<st.size()<<endl;