首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

二部图有关问题

2012-03-11 
二部图问题现在有一串数据,找出最大递增序列!比如:4 2 6 3 1 5最大递增序列为2 3 5 输出3就行了大家来讨论

二部图问题
现在有一串数据,找出最大递增序列!

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

大家来讨论一下,怎么解决一下这个问题!


[解决办法]
二部图是什么?二分图?

这个问题就是一个最大递增序列问题,最普通的想法就是用DP,n^2肯定可以(类似于LCS问题)。当然还可以优化到n*log(n),那是另一回事儿了。
[解决办法]
动规的经典例题?
[解决办法]
代码网上一大堆,说说思路吧,以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)的方法了。
[解决办法]
还是贴一段简单的代码吧,给自己留个备份,临时写的,希望没有错,C#的。

C# code
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);        }    }} 

热点排行