如何使用动态规划确定最长递增子序列?

2024-03-31

我有一组整数。我想找到最长递增子序列 https://en.wikipedia.org/wiki/Longest_increasing_subsequence该集合使用动态规划。


好的,我将首先描述最简单的解决方案,即 O(N^2),其中 N 是集合的大小。还存在一个 O(N log N) 解决方案,我也将对此进行描述。看here http://en.wikipedia.org/wiki/Longest_increasing_subsequence请参阅高效算法部分。

我假设数组的索引从 0 到 N - 1。所以让我们定义DP[i]以索引元素结束的 LIS(最长递增子序列)的长度i。计算DP[i]我们查看所有指数j < i并检查两个是否DP[j] + 1 > DP[i] and array[j] < array[i](我们希望它不断增加)。如果这是真的,我们可以更新当前的最优值DP[i]。要找到数组的全局最优值,您可以从中获取最大值DP[0...N - 1].

int maxLength = 1, bestEnd = 0;
DP[0] = 1;
prev[0] = -1;

for (int i = 1; i < N; i++)
{
   DP[i] = 1;
   prev[i] = -1;

   for (int j = i - 1; j >= 0; j--)
      if (DP[j] + 1 > DP[i] && array[j] < array[i])
      {
         DP[i] = DP[j] + 1;
         prev[i] = j;
      }

   if (DP[i] > maxLength)
   {
      bestEnd = i;
      maxLength = DP[i];
   }
}

我使用数组prev以便稍后能够找到实际序列而不仅仅是其长度。只需递归返回bestEnd在循环中使用prev[bestEnd]. The -1值是停止的标志。


好的,现在更高效O(N log N)解决方案:

Let S[pos]被定义为结束长度递增序列的最小整数pos。现在迭代每个整数X输入集并执行以下操作:

  1. If X> 最后一个元素S,然后附加X到最后S。这本质上意味着我们已经找到了一个新的最大的LIS.

  2. 否则找到最小元素S,即>= than X,并将其更改为X。 因为S任何时候都已排序,可以使用二分查找找到该元素log(N).

总运行时间 -N整数并对每个整数进行二分搜索 - N * log(N) = O(N log N)

现在我们来做一个真实的例子:

整数集合:2 6 3 4 1 2 9 5 8

Steps:

0. S = {} - Initialize S to the empty set
1. S = {2} - New largest LIS
2. S = {2, 6} - New largest LIS
3. S = {2, 3} - Changed 6 to 3
4. S = {2, 3, 4} - New largest LIS
5. S = {1, 3, 4} - Changed 2 to 1
6. S = {1, 2, 4} - Changed 3 to 2
7. S = {1, 2, 4, 9} - New largest LIS
8. S = {1, 2, 4, 5} - Changed 9 to 5
9. S = {1, 2, 4, 5, 8} - New largest LIS

所以LIS的长度是5(S 的大小)。

重建实际LIS我们将再次使用父数组。 让parent[i]是具有索引的元素的前驱i in the LIS以索引元素结束i.

为了让事情变得更简单,我们可以保留在数组中S,不是实际的整数,而是它们在集合中的索引(位置)。我们不保留{1, 2, 4, 5, 8},但保留{4, 5, 3, 7, 8}.

即输入[4] =1,输入[5] =2,输入[3] =4,输入[7] =5,输入[8] =8.

如果我们正确更新父数组,实际的 LIS 是:

input[S[lastElementOfS]], 
input[parent[S[lastElementOfS]]],
input[parent[parent[S[lastElementOfS]]]],
........................................

现在重要的是 - 我们如何更新父数组?有两种选择:

  1. If X> 最后一个元素S, then parent[indexX] = indexLastElement。这意味着最新元素的父元素是最后一个元素。我们只是前置X到最后S.

  2. 否则找到最小元素的索引S,即>= than X,并将其更改为X. Here parent[indexX] = S[index - 1].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用动态规划确定最长递增子序列? 的相关文章

  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 递归和大O

    我最近正在完成一项涉及递归和大 O 表示法的计算机科学作业 我相信我很好地理解了这一点 虽然当然不是完美的 但是有一个问题给我带来了最多的问题 奇怪的是 一看就知道是作业上最简单的一个 使用大哦符号提供最佳增长率来解决以下递归问题 T 1
  • 按百分比减少多边形面积

    我有一个由点 x y 组成的多边形 我想做的是将其减少一个百分比 请记住 我不想只是扩大规模 多边形应该有一种内部边界 其宽度取决于百分比 该内部边界被多边形切断 谁知道可以实现这一目标的算法 输入 点数组 百分比 输出 点数组 你所寻求的
  • 搜索/排序算法 - 是否有类似 GoF 的列表?

    我是一名自学成才的开发人员 坦率地说 我不太擅长找出在任何特定情况下使用哪种搜索或排序算法 我只是想知道是否有设计模式 esque 列出了以太坊中可用的常见算法 供我添加书签 就像是 算法名称 带有别名 如果有的话 它解决的问题 大O成本
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将嵌套字典中的所有键从camelCase转换为snake_case

    我有一本类似这样的字典 firstName abc lastName xyz favoriteMovies Star Wars The lone ranger favoriteCountries country China capitalC
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想

随机推荐

  • 如何使用 React Native 检测屏幕解锁?

    有谁知道我可以检测用户何时打开手机的方法吗 据我了解 当设备解锁时 例如输入正确的密码 android intent USER PRESENT 会被广播 但是 我不知道如何使用 React Native 来检测广播 有没有人有办法解决吗 调
  • 增加Python中cProfiler的深度以报告更多功能?

    我正在尝试分析一个调用其他函数的函数 我按如下方式调用分析器 from mymodule import foo def start foo import cProfile as profile profile run start outpu
  • 使用着色器创建模糊过滤器 - 从片段着色器访问相邻像素?

    我想使用 OpenGL ES 2 0 中的片段着色器创建模糊效果 我感兴趣的算法只是一个平均模糊 将所有相邻像素添加到我自己中并除以 9 进行标准化 但是我有两个问题 1 这是否需要我首先渲染到帧缓冲区 然后切换渲染目标 或者有更简单的方法
  • 在 Java 中过滤组合框数据

    在java中 假设有两个jpanel 当我单击Panle 1 上的按钮 A 时 它将显示面板 2 在面板 2 中 有两个组合框 我完成了所有必要的编码 但要过滤的一件事是组合框 1 将仅显示那些具有 book 前缀的数据 组合框 2 将仅显
  • Hibernate 对象相等性检查[重复]

    这个问题在这里已经有答案了 可能的重复 Hibernate 具有相同标识符值的不同对象已与会话关联 https stackoverflow com questions 3553200 hibernate different object w
  • 如何管理 Workflow Foundation 中的版本?

    当您有长时间运行的工作流并且持久性存储中可能同时有两个或三个版本并且必须能够访问所有版本时 如何管理 WF 中的工作流版本 我撰写了一系列 4 篇博客文章 涵盖了对长期运行的工作流程进行版本控制时需要注意的大部分内容 我倾向于避免的一件事是
  • 在设备上打印视图层次结构

    在我无法实际访问的三星手机上调试我的应用程序 结果出现奇怪的结果 我想要求用户运行一个已检测的应用程序来帮助调试 我的应用程序获得view其中有一个未知的 对我来说 层次结构 ViewGroupsETC 有没有办法 走路 View并打印出一
  • sencha列表分页插件

    我正在尝试使用 sencha touch 的列表分页插件 但几乎没有关于如何使用它的好 或坏 文档 我很困惑 当我激活列表中的插件时 this myList new Ext List store this myStore plugins p
  • 在 vim 中反转逗号分隔列表的最快方法是什么?

    我经常必须更正以下 Rails 代码 assert equal value expected assert equal 的两个参数是乱序的 应该是 assert equal expected value 在vim中 从第一行到第二行最有效的
  • 如何使用 C++ 初始化 const char 数组数据成员?

    我有一个与 C 类成员初始化相关的问题 下面的代码说明了我的问题 class ABCD public ABCD ObjNum 3 ABCD static const unsigned char getByte 8 const int Obj
  • 获取不包含滚动条宽度的 Div 宽度

    我这里有个问题 这里有两个div div1 和 div2 这里我想根据 div2 宽度调整 div1 宽度 我的要求是 div1 不应包含滚动条的宽度 即我应该设置 div1 的高度 不包括 div2 中滚动条的宽度 我想要一个 jquer
  • 如何将目录中每个文件中的制表符转换为空格?

    如何将目录中每个文件中的制表符转换为空格 可能递归地 另外 有没有办法设置每个选项卡的空格数 简单替换为sed可以 但不是最好的解决方案 如果选项卡之间存在 额外 空格 则它们在替换后仍将存在 因此边距将参差不齐 在行中间展开的选项卡也将无
  • 什么是方法内联? [复制]

    这个问题在这里已经有答案了 我一直试图理解这真正意味着什么 内联函数 在 C 中 定义的成员函数 类声明 2 函数 调用编译器替换为 该函数的实际代码 这 关键字 inline 可用于提示 编译器执行内联 成员身体的扩张或 非成员函数 in
  • 我可以在为 kindle fire 商店发布的应用程序中使用 Google Analytics 吗?

    我目前在 Play 商店中有一个使用谷歌分析的应用程序 我想修改并发布该应用程序到 Kindle 应用程序商店 并且仍然能够使用 GA 据我了解 这取决于播放服务能否正常工作 显然 kindle 设备上没有播放服务 但有没有办法将它们包含在
  • 将 ZeroMQ 交叉编译为 ARM,以便在 MonoTouch iPhone 应用程序配置设置中使用

    我正在尝试在使用 MonoTouch 用 C 开发的 iPhone 应用程序中使用 ZeroMQ 库 我几乎解决了所有的问题 却在最后一道坎倒下了 我正在使用 ZeroMQ 2 1 10 和 C CLR 绑定 包装器 并在 Mac OS X
  • 为什么默认字符串比较器无法保持传递一致性?

    我知道这个问题之前已经注意到 https stackoverflow com questions 9354966 string sorting issue in c sharp 9355086 9355086 或多或少简洁 但我仍然创建这个
  • 在 Google Colab 上设置 MLflow

    我经常使用 Google Colab 来训练 TF PyTorch 模型 因为 Colab 为我提供了 GPU TPU 运行时 此外 我喜欢使用 MLflow 来存储和比较经过训练的模型 跟踪进度 共享等 将 MLflow 与 Google
  • 如何在UITableView中显示滚动条

    我想显示某种指示来引导用户滚动 通常 当我们触摸 UITableView 时 如果需要 滚动条就会出现 但我希望这个滚动条指示已经显示在我的表格视图上 怎么可能这样做呢 如果您有一个超出屏幕的表格视图 您可以调用 self tableVie
  • 使用持久登录 Cookie 时,如何根据数据库中的 bcrypt-hashed 令牌检查 Cookie 令牌?

    In 这个流行的解决方案 https stackoverflow com a 477578 869849对于涉及生成随机 128 位 令牌 以保存在用户 Cookie 中的持久登录 Cookie Jens Roland 建议 And 不要将
  • 如何使用动态规划确定最长递增子序列?

    我有一组整数 我想找到最长递增子序列 https en wikipedia org wiki Longest increasing subsequence该集合使用动态规划 好的 我将首先描述最简单的解决方案 即 O N 2 其中 N 是集