最长递增子序列优化算法(时间复杂度为nlgn)
// 最长递增子序列优化算法.cpp : Defines the entry point for the console application.
//对于j位置的字符,我们需要寻找此位置之前的最大的len[i](i<j),然而len[i]是无序的
//如果len[i]有序,则可通过二分查找快速找到
//于是我们定义一个s[]数组,s[len[i]]存储str[i],表示长度为len[i]的递增子序列尾元素为str[i]。
//对于str的位置为j的元素,在s[]数组中进行二分查找,如果str[j]>s[mid],则查找后半部分的s[],直到下界超过上界,
//如果str[j]<=s[mid],则查找前半部分的s[],直到上界低于下界。
//如果下界大于当前最大长度maxLen,则更新maxLen
//时间复杂度为nlgn
#include "stdafx.h"
#include<iostream>
#define N 100
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//存储原字符串
char str[N];
//b[j]存储以j为长度的递增子序列的结尾元素
char b[N];
int cases;
cout<<"请输入案例个数:"<<endl;
cin>>cases;
while(cases--)
{
cout<<"请输入字符串:"<<endl;
cin>>str;
//初始化各变量
int i;
int length = strlen(str);
b[0] = '0'; //b[0]为最小,假设输入的字符全部是字母
b[1] = str[0];//以1为长度的递增子序列的结尾元素都是str[0]
int first,mid,end;//分别为二分查找的首,中,尾位置
int maxLen = 1; //为目前递增子序列最大长度
for(i=1;i<length;i++)
{
first = 0, end = maxLen;
while(first<=end)
{
mid = (first+end)/2;
if(b[mid]<str[i])
first = mid +1;
else
end = mid -1;
}
b[first] = str[i];
if(first>maxLen) maxLen++;
}
cout<<"最长递增子序列的长度为:"<<maxLen<<endl;
cout<<"最长递增子序列为:"<<endl;
for(i=1;i<=maxLen;i++)
cout<<b[i];
cout<<endl;
}
system("pause");
return 0;
}
-------------------------------------------------程序测试---------------------------------------------------------
请输入案例个数:
2
请输入字符串:
abaceabf
最长递增子序列的长度为:5
最长递增子序列为:
abcef
请输入字符串:
abcabcdef
最长递增子序列的长度为:6
最长递增子序列为:
abcdef
请按任意键继续. . .
分享到:
相关推荐
输入序列,求最长上升子序列的长度,算法复杂度nlgn
以排序算法为例,测试算法的时间复杂度。本次测试使用的是 1~n 的 n 个数的倒排序作为测试数据。 实验结果: 通过实验,我们得到了以下结果: | 数据规模 | 插入排序时间 | 堆排序时间 | | --- | --- | --- | | ...
最长单调递增子序列,运行时间为O(nlgn),为算法导论上的算法
在本案例中,我们关注的是C++实现的最近点对算法,其基于《离散数学及其应用》一书中的描述,并具有nlgn的时间复杂度,即线性对数时间复杂度,这是优化过的解决方案,相比简单的平方根搜索有了显著的效率提升。...
快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数中任意选出一个数,将...
最长上升子序列问题在计算机科学中是被广泛研究的,其求解算法也具有O(nlgn)的时间复杂度。在这里,作者可能利用LIS的思路来寻找电路元件之间的最优连接顺序,从而降低布线的交叉和复杂性。 总的来说,这三个PDF...
算法的时间复杂度是衡量算法效率的重要指标,它描述了算法执行时间与问题...总之,分析算法的时间复杂度对于优化算法性能至关重要。在设计算法时,应尽可能选择低阶的时间复杂度,以确保算法在大数据量时仍能高效运行。
优先队列排序算法是基于堆数据结构的实现,时间复杂度为θ(nlgn)。其主要思想是将元素插入到集合S中,并返回S中的最大key的元素,去掉并返回S中的最大key的元素,并将元素的关键字值增到k。 堆排序算法分为三个过程...
2. 归并排序:是一种稳定的排序算法,时间复杂度为O(nlgn)。它的基本思想是先使每个子序列有序,然后使子序列段间有序。 3. 快速排序:是一种交换类排序,时间复杂度为O(nlgn)。它的基本思想是将要排序的数据分割成...
1. 快速排序算法:快速排序是常用的排序算法之一,它的时间复杂度为O(nlgn),是非常高效的排序算法。 2. 分区函数:Partition函数是快速排序算法中的核心函数,用于分区数组元素,使得数组元素的顺序被打乱。 3. ...
这个解法的时间复杂度为 O(NlgN),因为我们需要对数组进行分治,并且对每一个子数组进行计算连续子序列和的操作。 解法 3:O(N)解法 这个解法是最优的解法,它只需要 O(N)的时间。思路是遍历数组中的每一个元素,...
时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶...
快速排序是一个经典的分治算法,它的最好情况时间复杂度为Θ(nlgn),但最坏情况下为Θ(n^2)。这里的i=lgn可能表示某种最坏情况下元素划分的次数。 4.3-1节和4.3-42节可能包含了算法复杂度的具体分析,其中涉及到了n...
如果选择的时间复杂度为Θ(nlgn)的排序算法,那么总时间复杂度将是Θ(nlgn) + Θ(n) = Θ(nlgn)。由于比较排序的下界是Ω(nlgn),因此这是基于比较的排序算法能达到的最优时间复杂度。空间复杂度方面,如果排序算法...
综上所述,该文档不仅提供了算法导论课后习题的答案,更重要的是,它深入浅出地介绍了算法分析的基本原理,包括时间复杂度分析、排序算法优化策略、算法修改技巧以及循环不变量的概念,这些都是理解和设计高效算法的...
- **基本形式**:O(ND)算法的时间复杂度和空间复杂度均为O(ND),这表明算法在处理相似性较高的序列时能够表现出极高的效率。 - **性能分析**:在基于基础随机模型的期望时间性能分析中,该算法表现出O(N+D^2)的时间...
- **递归式分析**:分析递归算法的时间复杂度,例如QuickSort算法在不同情况下的复杂度为Θ(n^2)(最坏情况)和Θ(nlgn)(最好情况)。 - **快速排序**:QuickSort是分治策略的一个典型例子,通过对数组分区并递归...
文档中还包含了不同算法的时间复杂度对比,如`lgn`、`√n`、`n`、`nlgn`、`n^2`、`n^3`和`2^n`等。通过计算每种复杂度级别下不同时间尺度(秒、分钟、小时、天、月、年、世纪)的执行时间,可以直观地感受到算法效率...
- 在动态规划用于解决最长公共子序列问题的递归关系中,c[i,j]代表x[1..i]和y[1..j]的最长公共子序列的长度。 通过这些知识点的解释,我们可以对算法领域中一些基本概念和经典问题有一个系统的认识。这些内容是...