二部图问题

pmars 2010-04-24 10:05:47
现在有一串数据,找出最大递增序列!

比如:4 2 6 3 1 5 最大递增序列为2 3 5 输出3就行了

大家来讨论一下,怎么解决一下这个问题!
...全文
740 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pmars 2010-04-25
  • 打赏
  • 举报
回复
谢谢了,这个问题昨天晚上我写了代码,今天早上过了,还是感谢回复!
又学到东西了!
绿色夹克衫 2010-04-24
  • 打赏
  • 举报
回复
还是贴一段简单的代码吧,给自己留个备份,临时写的,希望没有错,C#的。


using System;

namespace csdnTest
{
class Program
{
static void Main(string[] args)
{
int[] items = new int[] { 4, 2, 6, 3, 1, 2, 5 };

//用来记录序列长队最大值的数组,index + 1就是序列的长度
int[] maxValues = new int[items.Length];
int maxLength = 1;
maxValues[0] = items[0];

for (int i = 1; i < items.Length; i++)
{
//二分查找对应的最长序列
int lengthIndex = Array.BinarySearch<int>(maxValues, 0, maxLength, items[i]);

//针对于.Net里面的BinarySearch的特殊处理,不用理会
if (lengthIndex < 0)
lengthIndex = -lengthIndex - 1;

if (lengthIndex + 1 > maxLength)
maxLength = lengthIndex + 1;

maxValues[lengthIndex] = items[i];
}

Console.WriteLine(maxLength);
}
}
}
绿色夹克衫 2010-04-24
  • 打赏
  • 举报
回复
代码网上一大堆,说说思路吧,以4 2 6 3 1 5为例

逐个读入数字,

4 | 此时可能的队列长度为1,最大值为4
4 2 | 由于2 < 4,此时队列长度为1,最大值为2
4 2 6 | 6 > 2,队列有2个,一个长度为1,最大为2,一个长度为2,最大为6
4 2 6 3 | 3 < 6, 3 > 2,队列有2个,一个长度为1,最大为2,一个长度为2,最大为3
4 2 6 3 1 | 1 < 2, 1 < 3,队列有2个,一个长度为1,最大为1,一个长度为2,最大为3
4 2 6 3 1 5 | 5 > 1,5 > 3,队列有3个,一个长度为1,最大为1,一个长度为2,最大为3,一个长度为3,最大为5(分别是1 | 2,3 | 2,3,5)

走到头了,所以输出3,此时是一个最坏情况下n^2的算法,但如果每读入一个新的数时,不是逐个比较,而是利用二分法,查到小于该数的最长序列,那么就是n*log(n)的方法了。
pmars 2010-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 litaoye 的回复:]
二部图是什么?二分图?
[/Quote]
其实原题就是那个二部图原型,指示抽象到这样的问题了,之后我想知道n*lnN的算法是怎么一回事,要的就是优化之后的算法,给一个想法,之后有代码就更帅了!
关键是算法!望指点……
FlatHuge 2010-04-24
  • 打赏
  • 举报
回复
动规的经典例题?
绿色夹克衫 2010-04-24
  • 打赏
  • 举报
回复
二部图是什么?二分图?

这个问题就是一个最大递增序列问题,最普通的想法就是用DP,n^2肯定可以(类似于LCS问题)。当然还可以优化到n*log(n),那是另一回事儿了。

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧