LIS n*log(n)的理解
很多时候lis 用二分的方法比较方便 这里写一下他的原理
这里仅对严格的最长上升子序列做讨论
这里有两个数列 一个数列是 原串的数列 a1-an 另一个数列是最长上升子序列辅助数列 s数列的长度为 k, 是当前最长上升子序列长度
先来看看n*n的方法
dp[i]=max{dp[j]+1|j<i && ai>aj}
s数列是 对于当前的串 a1-ak 最长上升子序列为k j<=k 上升子序列长度为j的子串中,第j位最小的数为sj
用类似递推的思想 顺序从a1推到an
s0=-INF(INF 指无穷大)
对于当前的数ai
k=max{dp[j]|j>=1&&j<i}
s串长度为k
sx=min{aj| j>=1&&j<i&&dp[j]=x}
从a1顺序判断道an,到第i个位置 ,如果s数列满足上文的条件,s数列的长度为k 如果ai>sk ,即a1-a(i-1)中最长上升子序列长度为k,并且第k为最小的数为sk,那么说明到当前最长上升子序列可以增加一位。那么k+=1;s(k+1)=ai;
如果第i位ai<=sk 那么他不能是最长上升子序列增加一位 ,但是,他可能更新s数列,因为如果我们发现在s数列中存在s(j-1)<ai and sj>ai
sj就应该被ai更新,因为如果不更新,那么在a1-ai串中 上升子序列长度为j的子串中 第j为最小的不是sj, 而是ai ,所以这与s串的要求是不相符的。应该用ai替换sj 使sj满足条件
所以该算法的思路应该是
我们得到一个数ai
1 如果当前s 数列的长度为0 ,则 s1=ai;
2 如果当前s数列的长度为k,
如果ai>sk 那么 我们可以吧ai 加入到s数列的末尾
如果ai<=sk 。则说明在s数列中有一个数能被更新。找到一个位置j 使s(j-1)<ai并且s(j)>=ai 用ai替换sj。否则 s数列是不合法的
因为s数列是递增的 (自己可以证明),所以找到j位置是一个log级的算法 综合起来 这就是一个n*(logn)的算法
LIS n*log(n)的理解的更多相关文章
- 重写console.log的一些理解
关于重写console.log的方式通常都是这样的: console.log = (function(oriLogFunc){ return function(str) { oriLogFunc.ca ...
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同时也因 ...
- 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...
- Log Reservation
本文是在阅读<SQL Server Transaction Log Management>的Chapter 2: Log Internals时发现以往对Log Grows的理解比较片面,大 ...
- 我从来不理解JavaScript闭包,直到有人这样向我解释它...
摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文非常长.可是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同一时 ...
- 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...
正如标题所述,JavaScript 闭包对我来说一直有点神秘,看过很多闭包的文章,在工作使用过闭包,有时甚至在项目中使用闭包,但我确实是这是在使用闭包的知识. 最近看国外的一些文章,终于,有人用于一种 ...
- js中两个!!的理解
在js中经常有两个!!出现,经常让人难以理解 (function () { var a = 10; var b = 20; function add(num1, num2) { var num1 = ...
- python 检索一个目录下所有的txt文件,并把文件改为.log
检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...
随机推荐
- var genreModel =storeDB.Genres.Include("Albums").Single(g => g.Name == genre);是什么意思?
g => g.Name == genre代表一个匿名函数.即这里向Single方法传入了一个方法类型的参数. =>左边的g代表方法的参数,可以有多个,如(g,f) => ...,=& ...
- PrintStream打印流
package file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...
- oracle数据泵之解决方案(用户)导入导出。
看到网上有这样的介绍而且很多,但觉得都是大神才能一下子看的懂.自己总结下菜鸟能看懂的. 1.导出. 首先第一步: 操作系统—开始—运行输入“cmd”进入dos界面输入“sqlplus/nolog”按回 ...
- java获取当前时间
/////////////////获取时间方法一////////////////////////////// java.util.Date uDate=new java.util.Date(); Sy ...
- 将Altium中的原理图与PCB导出为PDF的步骤与方法
1.通过File-Smart PDF(文件-智能PDF),快捷键F-M打开. 2.选择打印的范围:Current Project还是Current Document,还有生成的PDF的存放位置. 3. ...
- IBM Cognos 10 启动报错
报错信息: 15:35:02, 'LogService', 'StartService', 'Success'. 15:35:03, CAF input validation enabled. 15: ...
- 【细说Java】Java变量初始化顺序
Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...
- CoreText学习(一)Base Objects of Core Text
最近要做一个读入Word,PDF格式等的文件并且加以编辑的程序,本来以为使用Text Kit结合Text View来打开doc文件是完全没问题的,结果用了各种方法打开要么是数据是nil,要么打开的文字 ...
- [Qt] IP地址输入框实现
封装了一个ip地址的输入框.网络上下载了份代码,找不到哪里的了.经过修改之后,尽力让它的行为和windows的IP地址输入框的行为看起来像些.代码如下: //ipaddredit.h #ifndef ...
- Android笔记(一):从this关键字发散
this指的是直接包含它的类的实例. 例如: public class MyClass{ int num; public MyClass(int num){ this.num = num; } } 这 ...