`
datoplay
  • 浏览: 1611663 次
文章分类
社区版块
存档分类
最新评论

最长递增子序列优化算法(时间复杂度为nlgn)C++实现

 
阅读更多

最长递增子序列优化算法(时间复杂度为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源码

    输入序列,求最长上升子序列的长度,算法复杂度nlgn

    单调递增子序列

    最长单调递增子序列,运行时间为O(nlgn),为算法导论上的算法

    快速排序算法的简单实现

    快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数中任意选出一个数,将...

    平衡二叉树c++模版

    可以提供时间复杂度在nlgn的排序,也可以提供lgn的查询。是一个很不错的数据结构,可是以和其它的现在比较新的一些数据结构比美。虽然有人对其进行过优化,而且在单个问题上,哈希有时候能取得更好的效过但是,这个...

    离散数学及其应用---最近点对算法C++实现

    使用C++编写的寻找最近点对算法,是基于机械工业出版社出版的《离散数学及其应用》中的叙述给出的实现,nlgn复杂度下求解最近的点对

    大整数乘法FFT实现(java)

    时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶...

    算法导论 多项式FFT Matlab实现

    算法导论第30章多项式乘法 FFT算法 复杂度O(nlgn)

    百度:部分算法面试题1

    第二步:找出Top 10 算法一:普通排序 我想对于排序算法大家都已经不陌生了,这里不在赘述,我们要注意的是排序算法的时间复杂度是NlgN,在本题目

    电路布线 (O(nlgn)的算法)

    电路布线问题求解的改进算法 O(nlgN)的算法 内有3个pdf 都是对同一问题的不同方面的描述及推广

    快速排序的三种写法及随机化快速排序

    快速排序的三种写法及随机主元快速排序时间复杂度是nlgn,

    几种常见排序算法实现

    基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起...

    给n个整数的集合s和一个整数x,判断是否存在两个数的和为x

    算法课本的题目,要求复杂度是(nlgn)。

    最优二叉树

    最优二叉查找树,为算法导论上的算法,时间复杂度O(nlgn),思考题15.5-

    计算一个数组中逆序对的个数

    设A[1..n]是包含n个不同数的数组,如果i而且A[i]&gt;A[j],则(i,j)为一个逆序组,给出时间复杂度为nlgn算法,确定n个任意元素排列中逆序组的个数。

    最近点对问题的实现

    使用分治的思想,将最近点对问题转化为左右和横跨左右的点对的问题,由左右两个子问题返回左右两边最短的点...算法一共递归logn次,每层计算量都为n,而主函数调用两次快排,综合起来,整个算法的时间复杂度为O(nlgn)。

    C++ 数据结构 堆排序的实现

    堆排序(heapsort)是一种比较快速的排序方式,它的时间复杂度为O(nlgn),并且堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个堆来简单分析一下。 堆排序的基本思想为: 1、升序...

    几种经典的排序算法,源代码

    (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; 堆排序所...

    C++线性时间的排序算法分析

    如插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序(可以参考前一篇文章:各种内部排序算法的实现)等,这些排序算法都有一个...

    python 算法 排序实现快速排序

    快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn)。最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候。在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),...

    各种排序算法的比较与分析

    (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。  快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;  堆排序...

Global site tag (gtag.js) - Google Analytics