最长递增子序列(Longest Increase Subsequence)

本文深入探讨了求解最长递增子序列问题的动态规划方法,特别强调了时间复杂度为O(nlogn)的优化策略。通过实例分析,详细解释了如何在给定无序数组中找到最长递增子序列,以及动态规划在这类问题上的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已知一个无序的数组{1,3,8,2,7,19,6,2,18,14,16},则这个数组的最长子序列为{1,2,7,9,14,19},这表明最长递增子序列是可以不连续的。


这道题是9月23号在腾讯笔试的时候看到的,是一道填空题,问的是最快的时间复杂度和最少的空间复杂度,当时想的是用动态规划来分析,因为对动态规划理解得的不够,所以根据对最长公共子序列的回忆,填了时间复杂度(n∧2)和空间复杂度(n∧2),显然,答案是错误的。虽然最长递增子序列和最长公共子序列有相同的地方,比如把无序的序列按升序排序后,然后和原序列一起求最长公共子序列,得到的就是最长递增子序列,但实际上最长递增子序列有更优的时间复杂度(nlog2n)。


利用动态规划分析,我们定义序列为a[1-n],c[1-n]为第i个数的最大递增子序列长度,c[1]-c[n]的值先初始化为1,对c[i]分析,我们发现,c[i]是一个问题的一个最优子结构,c[i]=max(c[j]+1), 1<j<i&&a[j]<a[j],例如a[8] ={1,2,3,6,7,5,8,4},则c[8] = {1,1+1=2,2+1=3,3+1=4,4+1=5,3+1=4,5+1=6,3+1=4}。

关于时间复杂度(nlog2n)是如何实现的可以看这里:http://www.programfan.com/blog/article.asp?id=13086

### 单调性评估指标的MATLAB实现 #### 定义单调性评估指标 单调性是指函数在其定义域内随着自变量增加而保持不变或持续增减的趋势。对于离散数据集,可以通过计算相邻点之间的差分来判断序列是否呈现单调递增或递减趋势。 为了量化这种特性,可以引入几个常用的单调性评估指标: - **单调递增比例 (Monotonic Increase Ratio, MIR)**:衡量给定序列中连续上升的比例。 - **最长递增子序列长度 (Longest Increasing Subsequence Length, LISL)**:表示最大可能的严格递增子序列的长度。 - **平均斜率 (Average Slope, AS)**:描述整个区间内的总体变化速率。 这些指标可以帮助更全面地了解数据的变化规律及其稳定性[^1]。 #### MATLAB代码实现 下面提供一段用于计算上述三个单调性评估指标的MATLAB脚本: ```matlab function metrics = monotonicityMetrics(data) % MONOTONICITYMETRICS 计算输入向量data的单调性评估指标 n = length(data); % 初始化输出结构体 metrics.MIR = NaN; % Monotonic Increase Ratio metrics.LISL = NaN; % Longest Increasing Subsequence Length metrics.AS = NaN; % Average Slope if n < 2 warning('Input data too short to evaluate.'); return; end %% Calculate MIR diffs = diff(data); % Compute differences between consecutive elements posDiffsCount = sum(diffs > 0); % Count positive changes metrics.MIR = posDiffsCount / (n - 1); %% Calculate LISL using dynamic programming approach lisLengths = ones(1,n); % Initialize lengths of increasing subsequences ending at each position for i=2:n for j=1:i-1 if data(i) > data(j) && lisLengths(i) < lisLengths(j)+1 lisLengths(i) = lisLengths(j)+1; end end end metrics.LISL = max(lisLengths); %% Calculate AS metrics.AS = mean(diff(data)) ./ mean([diff((1:length(data)))]); end ``` 此函数接收一个数值型数组作为输入,并返回包含MIR、LISL以及AS这三个主要属性的结果结构体。通过这种方式可以在MATLAB环境中方便快捷地完成对任意一维时间序列或其他形式的数据集合进行单调性的定量分析工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值