很多时候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)的理解的更多相关文章

  1. 重写console.log的一些理解

    关于重写console.log的方式通常都是这样的: console.log = (function(oriLogFunc){ return function(str) { oriLogFunc.ca ...

  2. 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)

    前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同时也因 ...

  3. 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...

  4. Log Reservation

    本文是在阅读<SQL Server Transaction Log Management>的Chapter 2: Log Internals时发现以往对Log Grows的理解比较片面,大 ...

  5. 我从来不理解JavaScript闭包,直到有人这样向我解释它...

    摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...

  6. 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)

    前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文非常长.可是我坚持看完了,收获颇多,也深深为Jay哥的技术能力.架构能力和对于分布式系统的理解之深刻所折服.同一时 ...

  7. 我从来不理解 JavaScript 闭包,直到有人这样向我解释它...

    正如标题所述,JavaScript 闭包对我来说一直有点神秘,看过很多闭包的文章,在工作使用过闭包,有时甚至在项目中使用闭包,但我确实是这是在使用闭包的知识. 最近看国外的一些文章,终于,有人用于一种 ...

  8. js中两个!!的理解

    在js中经常有两个!!出现,经常让人难以理解 (function () { var a = 10; var b = 20; function add(num1, num2) { var num1 = ...

  9. python 检索一个目录下所有的txt文件,并把文件改为.log

    检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...

随机推荐

  1. FCKEditor的用法(asp版)

    1:下载FCKEditor 去www.baidu.com 搜索,我本来想上传的,但不知道怎么传.下载下来后解压到你网站的目录,最好就放在根目录下,文件夹名字就用FCKEditor:这里可以随便自己喜好 ...

  2. web安全:HTTPS

    E1:搭建zoobar网站开启apache服务和mysql服务service apache2 startservice mysql start 建立数据库和表mysql->create data ...

  3. java1200例-文字的探照灯效果

    <style> .mydiv{ color:white; filter:light; height:; font-size:35px; left:10px; position:relati ...

  4. 可用版本的host

    http://blog.csdn.net/ljphhj/article/details/11939591 http://my.oschina.net/lvkun0223/blog/282356 两者的 ...

  5. hadoop深入研究:(十八)——Avro schema兼容

    转载请写明来源地址:http://blog.csdn.net/lastsweetop/article/details/9900129 所有源码在github上,https://github.com/l ...

  6. HDU_2013——蟠桃记,反向推理

    Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...

  7. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  8. 原来你们是这种key-value存储

    上周毛老师,在内部分享为我们扫盲了一下Memcached和Redis的支持,讲了很多东西,我一般比较懒不愿意去记东西喜欢把总结成blog,当我忘记的时候可以回头看看.好的废话就说这么多.先看Memca ...

  9. android 初学: 提示No Launcher activity found!

    提示No Launcher activity found! 三步检查: 1 必须有 <category android:name="android.intent.category.LA ...

  10. [深入React] 5.MVC

    react 是一种典型的MVC框架. 在jquery中,我们都是针对dom编程,由dom事件触发dom改变,MVC三层代码混在一起. 比如点击变颜色 $('#btn').click(function( ...