关于最长公共子序列问题的空间优化
/*** 最长公共子序列* 优化了内存空间的使用* 观察到一件事: 每一个元素的计算,只和其在左上, 左边, 上边的三个元素相关* 可以考虑len(x) + 3* 3个变量 定义为leftAbove, left, above*/
#include<iostream>
#include<string>
#include<memory.h>
using namespace std;int LCS(string x, string y);int main() {string x, y;cin>>x>>y;LCS(x, y);
}int LCS(string x, string y){int lenx = x.length();int leny = y.length();int leftabove, left, above; //左上角 左 上int *compute = new int[leny + 1]; //compute[0] 即原来的calc[i][0] for i in [0, lenx];memset(compute, 0, (leny + 1) * sizeof(int));for(int i = 1; i <= lenx; i++) {leftabove = left = compute[0];above = compute[1];for(int t = 0; t <= leny; t++) cout<<compute[t]<<" ";cout<<endl;for(int j = 1; j <= leny; j++) { //计算,并且更新这三个变量if(x[i - 1] == y[j - 1]) compute[j] = leftabove + 1;else if(left > above) compute[j] = left;else compute[j] = above;//更新此三个变量,很有技巧的哦leftabove = above;above = compute[j + 1];left = compute[j];}}cout<<compute[leny]<<endl; delete[] compute;
}
受一篇文章启发
http://blog.csdn.net/oyzdz1988/article/details/4456443
发现可以把空间减少到min{lenX, lenY} +O(1) 上述就是代码
从这个题目得到一点认识:只做足够,优化到极致.
关于最长公共子序列问题的空间优化相关推荐
- 最长公共子序列(O(n)空间优化、O(nlogn)时间优化)
普通算法 对于求最长公共子序列,最普遍的就是时间复杂度为O(n^2),空间复杂度为O(n*n)算法.重要的是,若要求出最长公共子序列是什么,则必须使用这一种算法,具体代码如下: int dp[maxn ...
- LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化
LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...
- 求最长公共子序列的空间优化。
我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j]. ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法
在参阅<A Longest Common Subsequence Algorithm Suitable for Similar Text Strings>(Narao Nakatsu,Ya ...
- 最长公共子序列(LCS问题)
先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- java最长公共子序列_技术分享 | 最长公共子序列在比对工具的应用
即使如何1 在实际工作中,我们常常要对输出的文本和数据进行比对:以取证大师为例,取证大师导出的取证结果数据量很容易达到上万条.这类数据特点除了数量级大外,其实数据结构很相近.即使我们以无以伦比的细致和 ...
最新文章
- C#表达式,类型和变量
- 0基础学习数据分析必须掌握的技能有哪些?
- 设计模式16——Memento设计模式
- linux下curl的使用
- C++STL容器大全
- 维特比算法—打字输入预测
- java bitset_Java BitSet nextSetBit()方法与示例
- rem布局 html,移动端h5之rem布局/px2rem
- 【AtCoder】AGC009
- MySQL 输入输出 XML
- python文件对象提供了3个读方法、分别是-案例驱动式Python基础与应用-超星尔雅-学习通-题库零氪...
- 【C 语言提高、进阶】Day 3
- IDEA 社区版下载与安装
- windows7计算机用户账户,浅析win7旗舰版系统中三种系统用户账户的特点
- php如何实现快速压缩视频,如何把大视频压缩小 怎么将视频压缩到最小方便储存...
- 怎么退出自适应巡航_什么是ACC自适应巡航
- 查找谷歌浏览器中的Internet选项
- 内置式永磁电机maxwell2d_「仿真」永磁同步电机仿真(实操三)Maxwell 2D 静态磁场仿真...
- python接入支付宝接口
- 英语语法---动词详解
热门文章
- zx2020039-2立项报告
- 【课程作业】西瓜书 机器学习课后习题 : 第七章
- 意想不到的试衣方法, kinect试衣镜将问世,神奇!
- docker-compose.yml 配置文件详解
- 《Cross-view Transformers for real-time Map-view Semantic Segmentation》论文笔记
- 特征值分解用于数据压缩(matlab实现)
- Ripro9.0全解密去扩展版修正升级版+两款WP美化包+下载信息美化等插件,新增易支付接口
- 计算机的存储器先关知识,最详细的存储器知识大盘点!
- 奔驰灯光互动项目开发历险记,2019春节前10天
- C语言红皮书(1-8)笔记回顾