F*r
2 楼
一个任意的数组,找出一个严格单调递增的最长子序列。只知道怎么用dynamic
programming.求一个nlogn的算法。谢谢!
programming.求一个nlogn的算法。谢谢!
b*e
3 楼
【 以下文字转载自 Military 讨论区 】
发信人: withoutacar (知道错了, 改过来就好.), 信区: Military
标 题: Re: 小结老将的一个语言游戏策略
发信站: BBS 未名空间站 (Tue Dec 21 18:36:07 2010, 美东)
老将的策略就是代表中国人落后.
他找不到中国人落后的地方, 就拿自己举例.
发信人: withoutacar (知道错了, 改过来就好.), 信区: Military
标 题: Re: 小结老将的一个语言游戏策略
发信站: BBS 未名空间站 (Tue Dec 21 18:36:07 2010, 美东)
老将的策略就是代表中国人落后.
他找不到中国人落后的地方, 就拿自己举例.
t*a
4 楼
【 以下文字转载自 PDA 讨论区 】
发信人: per (look back), 信区: PDA
标 题: 找个满意的tablet不容易
发信站: BBS 未名空间站 (Fri Nov 24 01:11:29 2017, 美东)
iPad:没有back键
Samsung Galaxy:有back键,但在右边。跟手机相反,别扭。
发信人: per (look back), 信区: PDA
标 题: 找个满意的tablet不容易
发信站: BBS 未名空间站 (Fri Nov 24 01:11:29 2017, 美东)
iPad:没有back键
Samsung Galaxy:有back键,但在右边。跟手机相反,别扭。
r*e
6 楼
http://en.wikipedia.org/wiki/Longest_increasing_subsequence
【在 F**********r 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 一个任意的数组,找出一个严格单调递增的最长子序列。只知道怎么用dynamic
: programming.求一个nlogn的算法。谢谢!
【在 F**********r 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 一个任意的数组,找出一个严格单调递增的最长子序列。只知道怎么用dynamic
: programming.求一个nlogn的算法。谢谢!
c*2
7 楼
避光,要不放冰箱
j*u
8 楼
写了个只返回count的,要返回子序列在这个基础上加一个index array就可以了。
time O(nlogk), space O(k), k == length of LIS
int LIS(int[] array)
{
if (array == null || array.Length == 0)
return 0;
var incIndex = new List { 0 };
for (int i = 1; i < array.Length; ++i)
{
if (array[i] > array[incIndex.Last()])
incIndex.Add(i);
else
{
int l = 0;
for (int r = incIndex.Count; l <= r;)
{
int m = l + (r - l) / 2;
if (array[i] <= array[incIndex[m]])
r = m - 1;
else
l = m + 1;
}
incIndex[l] = i;
}
}
return incIndex.Count;
}
【在 F**********r 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 一个任意的数组,找出一个严格单调递增的最长子序列。只知道怎么用dynamic
: programming.求一个nlogn的算法。谢谢!
time O(nlogk), space O(k), k == length of LIS
int LIS(int[] array)
{
if (array == null || array.Length == 0)
return 0;
var incIndex = new List
for (int i = 1; i < array.Length; ++i)
{
if (array[i] > array[incIndex.Last()])
incIndex.Add(i);
else
{
int l = 0;
for (int r = incIndex.Count; l <= r;)
{
int m = l + (r - l) / 2;
if (array[i] <= array[incIndex[m]])
r = m - 1;
else
l = m + 1;
}
incIndex[l] = i;
}
}
return incIndex.Count;
}
【在 F**********r 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 一个任意的数组,找出一个严格单调递增的最长子序列。只知道怎么用dynamic
: programming.求一个nlogn的算法。谢谢!
h*3
10 楼
私下问了jerryju 大虾,大概弄明白了。照葫芦画瓢写了个c++版本的,
打印出最大长度和最大序列。
jerryju大虾别骂我抄袭啊。
void mit_LIS(int arr[],int len)
{
vector incIndex;
vector preIndex;
int index;
incIndex.push_back(0);
preIndex.push_back(-1);
for ( int i=1;i {
if ( arr[i] >= arr[incIndex[incIndex.size()-1]] )
{
preIndex.push_back(incIndex[incIndex.size()-1]);
incIndex.push_back(i);
}
else
{
int l=0,r=incIndex.size()-1,m;
while ( l<=r )
{
m = l + (r-l)/2;
if ( arr[i] <= arr[incIndex[m]] )
r = m - 1;
else
l = m + 1;
}
incIndex[l] = i;
index = l > 0 ? incIndex[l-1]:-1;
preIndex.push_back(index);
}
}
cout << " the length of LIS is " << incIndex.size() << endl;
index = incIndex[incIndex.size()-1];
do
{
cout << arr[index] << " ";
index = preIndex[index];
}while ( index != -1);
}
【在 j*****u 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 写了个只返回count的,要返回子序列在这个基础上加一个index array就可以了。
: time O(nlogk), space O(k), k == length of LIS
: int LIS(int[] array)
: {
: if (array == null || array.Length == 0)
: return 0;
: var incIndex = new List { 0 };
: for (int i = 1; i < array.Length; ++i)
: {
: if (array[i] > array[incIndex.Last()])
打印出最大长度和最大序列。
jerryju大虾别骂我抄袭啊。
void mit_LIS(int arr[],int len)
{
vector
vector
int index;
incIndex.push_back(0);
preIndex.push_back(-1);
for ( int i=1;i
if ( arr[i] >= arr[incIndex[incIndex.size()-1]] )
{
preIndex.push_back(incIndex[incIndex.size()-1]);
incIndex.push_back(i);
}
else
{
int l=0,r=incIndex.size()-1,m;
while ( l<=r )
{
m = l + (r-l)/2;
if ( arr[i] <= arr[incIndex[m]] )
r = m - 1;
else
l = m + 1;
}
incIndex[l] = i;
index = l > 0 ? incIndex[l-1]:-1;
preIndex.push_back(index);
}
}
cout << " the length of LIS is " << incIndex.size() << endl;
index = incIndex[incIndex.size()-1];
do
{
cout << arr[index] << " ";
index = preIndex[index];
}while ( index != -1);
}
【在 j*****u 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 写了个只返回count的,要返回子序列在这个基础上加一个index array就可以了。
: time O(nlogk), space O(k), k == length of LIS
: int LIS(int[] array)
: {
: if (array == null || array.Length == 0)
: return 0;
: var incIndex = new List
: for (int i = 1; i < array.Length; ++i)
: {
: if (array[i] > array[incIndex.Last()])
g*A
11 楼
嗯
放冰箱
放冰箱
F*r
13 楼
大家有没有发现这个link上的source code,http://www.algorithmist.com/index.php/Longest_Increasing_Subsequence.cpp。
做binary search, v 不是指向c-1,而是c... 俩位的code都是c-1...这个有什么说法么?
【在 j*****u 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 呵呵,多谢share!
: 一个小问题是你最后print的LIS是逆序的,可以用stack revert一下
做binary search, v 不是指向c-1,而是c... 俩位的code都是c-1...这个有什么说法么?
【在 j*****u 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 呵呵,多谢share!
: 一个小问题是你最后print的LIS是逆序的,可以用stack revert一下
s*y
14 楼
我写的C解法,不知道咋样,各位大牛请检阅
参考了wiki和这里的java代码的,因为只理解这个java的
https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5920&ln
gWId=2
参考了wiki和这里的java代码的,因为只理解这个java的
https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5920&ln
gWId=2
g*e
16 楼
你这个是O(n^2)的
ln
【在 s*****y 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 我写的C解法,不知道咋样,各位大牛请检阅
: 参考了wiki和这里的java代码的,因为只理解这个java的
: https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5920&ln
: gWId=2
ln
【在 s*****y 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 我写的C解法,不知道咋样,各位大牛请检阅
: 参考了wiki和这里的java代码的,因为只理解这个java的
: https://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5920&ln
: gWId=2
g*s
20 楼
不明白会了O(n)为啥还要找O(nlgn)的?除非你是老师,要教学生。
否则,你就用O(n)的算出来,得到结果你再做一遍无用的排序,这样就把算法拉到
nlgn了。 :)
否则,你就用O(n)的算出来,得到结果你再做一遍无用的排序,这样就把算法拉到
nlgn了。 :)
g*s
22 楼
DP is O(n).
【 在 FrLeafClover (4LeafClover) 的大作中提到: 】
【 在 FrLeafClover (4LeafClover) 的大作中提到: 】
s*o
25 楼
c*0
30 楼
DP 是 n^2
binary search 是 nlog(n)
binary search 是 nlog(n)
r*r
32 楼
L= incIndex.Count
当往incIndex里新添元素的时候,L自己就加1了。而当当前的array[i]小于
array[incIndex.Last()]的时候(else那一种情况),j必然小于L,所以L就不用变了
另外三楼四楼群的代码和wikipedia上的算法比较有一个bug,“incIndex[l] = i”之
前需要先判断array[i]是否小于array[incIndex[l]],是的话才需要更新incIndex[l]
的值
,怎么能得
出最
【在 s****o 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 这个好像没有比较阿(新发现的和已经发现的比较, 像二楼中的L = max(L, j+1)),怎么能得出最
: 长的序列?那位大虾指导一下?
当往incIndex里新添元素的时候,L自己就加1了。而当当前的array[i]小于
array[incIndex.Last()]的时候(else那一种情况),j必然小于L,所以L就不用变了
另外三楼四楼群的代码和wikipedia上的算法比较有一个bug,“incIndex[l] = i”之
前需要先判断array[i]是否小于array[incIndex[l]],是的话才需要更新incIndex[l]
的值
,怎么能得
出最
【在 s****o 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 这个好像没有比较阿(新发现的和已经发现的比较, 像二楼中的L = max(L, j+1)),怎么能得出最
: 长的序列?那位大虾指导一下?
F*r
33 楼
re这个。另外那个查找,algorithm上是v = c 而不是c-1...有什么说法没?
【在 r********r 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: L= incIndex.Count
: 当往incIndex里新添元素的时候,L自己就加1了。而当当前的array[i]小于
: array[incIndex.Last()]的时候(else那一种情况),j必然小于L,所以L就不用变了
: 另外三楼四楼群的代码和wikipedia上的算法比较有一个bug,“incIndex[l] = i”之
: 前需要先判断array[i]是否小于array[incIndex[l]],是的话才需要更新incIndex[l]
: 的值
:
: ,怎么能得
: 出最
【在 r********r 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: L= incIndex.Count
: 当往incIndex里新添元素的时候,L自己就加1了。而当当前的array[i]小于
: array[incIndex.Last()]的时候(else那一种情况),j必然小于L,所以L就不用变了
: 另外三楼四楼群的代码和wikipedia上的算法比较有一个bug,“incIndex[l] = i”之
: 前需要先判断array[i]是否小于array[incIndex[l]],是的话才需要更新incIndex[l]
: 的值
:
: ,怎么能得
: 出最
s*y
34 楼
看了各位大牛的实现后,写了个O(nlgk)的C实现
#include
#include
//assume input array size < 20
#define ARRAY_SIZE 20
/*P[k] —stores the position of the
predecessor of X[k] in the longest increasing subsequence ending at X[k].*/
static int P[ARRAY_SIZE];
/*M[j] stores the position k of the smallest value X[k]
such that there is an increasing subsequence of length j ending
at X[k] on the range k ≤ i (note we have j ≤ k ≤ i here)*/
static int M[ARRAY_SIZE];
void Find_Lis(int input[], int size, int lis[], int *lis_length)
{
int i, j, k;
int index = 0;
int tmp;
M[0] = 0; //init the base;
for (i = 1; i < size; i++) {
if (input[i] > input[M[index]]) {
P[i] = M[index];
index++;
M[index] = i;
continue;
}
//binary search for the smallest k within array M that input[i] <
input[k]
k = index;
for (j = 0; j < k ; ) {
tmp = j + (k-j)/2;
if (input[M[tmp]] < input[i])
j = tmp+1;
else
k = tmp;
}
if (input[i] < input[M[j]]) {
if (j > 0)
P[i] = M[j-1];
M[j] = i;
}
}
*lis_length = index + 1; //LIS length
j = M[index]; //last index of the LIS
for (i = index; i >= 0; i--) {
lis[i] = input[j];
j = P[j];
}
return;
}
int main() {
int test[] = { 1, 9, 3, 8, 11, 4, 5, 6, 4, 19, 7, 1, 7 };
int lis[20], lis_length;
Find_Lis(test, sizeof(test) / sizeof(int), lis, &lis_length);
return 0;
}
【在 F**********r 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: re这个。另外那个查找,algorithm上是v = c 而不是c-1...有什么说法没?
#include
#include
//assume input array size < 20
#define ARRAY_SIZE 20
/*P[k] —stores the position of the
predecessor of X[k] in the longest increasing subsequence ending at X[k].*/
static int P[ARRAY_SIZE];
/*M[j] stores the position k of the smallest value X[k]
such that there is an increasing subsequence of length j ending
at X[k] on the range k ≤ i (note we have j ≤ k ≤ i here)*/
static int M[ARRAY_SIZE];
void Find_Lis(int input[], int size, int lis[], int *lis_length)
{
int i, j, k;
int index = 0;
int tmp;
M[0] = 0; //init the base;
for (i = 1; i < size; i++) {
if (input[i] > input[M[index]]) {
P[i] = M[index];
index++;
M[index] = i;
continue;
}
//binary search for the smallest k within array M that input[i] <
input[k]
k = index;
for (j = 0; j < k ; ) {
tmp = j + (k-j)/2;
if (input[M[tmp]] < input[i])
j = tmp+1;
else
k = tmp;
}
if (input[i] < input[M[j]]) {
if (j > 0)
P[i] = M[j-1];
M[j] = i;
}
}
*lis_length = index + 1; //LIS length
j = M[index]; //last index of the LIS
for (i = index; i >= 0; i--) {
lis[i] = input[j];
j = P[j];
}
return;
}
int main() {
int test[] = { 1, 9, 3, 8, 11, 4, 5, 6, 4, 19, 7, 1, 7 };
int lis[20], lis_length;
Find_Lis(test, sizeof(test) / sizeof(int), lis, &lis_length);
return 0;
}
【在 F**********r 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: re这个。另外那个查找,algorithm上是v = c 而不是c-1...有什么说法没?
s*b
35 楼
现在的牛人都直接贴code。。。
哪位能把算法总结一下,wiki那个页面好像访问不了,我又比较弱看code不是太懂啊。
不太明白binary search 那段的作用。
哪位能把算法总结一下,wiki那个页面好像访问不了,我又比较弱看code不是太懂啊。
不太明白binary search 那段的作用。
s*y
36 楼
concentrate on the definitoin of these two arrays:
M[j] — stores the position k of the smallest value X[k] such that there
is an increasing subsequence of length j ending at X[k] on the range k ≤ i
(note we have j ≤ k ≤ i here).
P[k] — stores the position of the predecessor of X[k] in the longest in
creasing subsequence ending at X[k].
Then you will know what the binary search for.
【在 s*******b 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 现在的牛人都直接贴code。。。
: 哪位能把算法总结一下,wiki那个页面好像访问不了,我又比较弱看code不是太懂啊。
: 不太明白binary search 那段的作用。
M[j] — stores the position k of the smallest value X[k] such that there
is an increasing subsequence of length j ending at X[k] on the range k ≤ i
(note we have j ≤ k ≤ i here).
P[k] — stores the position of the predecessor of X[k] in the longest in
creasing subsequence ending at X[k].
Then you will know what the binary search for.
【在 s*******b 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 现在的牛人都直接贴code。。。
: 哪位能把算法总结一下,wiki那个页面好像访问不了,我又比较弱看code不是太懂啊。
: 不太明白binary search 那段的作用。
相关阅读
用了一年半的iphone5s报废了求推荐:macbook pro 接 显示器【包子求助】att A1549版iphone6在中国能不能用 (转载)[出售]BRAND-NEW MacBook Pro 13" RETINA MF840LL/A $1200 OBO (转载)iphone照片删除了,怎么还占用空间?iPad上的微信无法接视频电话,但是可以打出去,什么问题新Macbook和MBP选哪个好呢?我今天才意识到流媒体这个市场很大不用智能手机的牛人们,你们见过么?MBP safari忽然不工作怎么回事?Apple TV airplay 很卡 求助国内能连icloud吗?果子的写作风格十年一剑终成空 苹果缘何败走智能电视IPhone 6过两个月会降价吗?Apple Photos如何为某个album生成一个sharing URL?问关于买iphone6的问题。谢谢就凭一点macbook就秒杀所有其他笔记本关于apple care的问题mac safari pdf怎么下载到特定文件夹