使用分而治之找到增长最快的子序列

时间:2016-08-03 04:17:37

标签: algorithm data-structures divide-and-conquer

上周在接受采访时,我被问到上面的问题,正如预期的那样,我无法正确回答,后来当我查看时,我看到它是一个基于动态编程的算法。我不熟悉动态编程,但是假设我要设计这个算法然后我该如何处理呢?

假设,我从其他划分和征服算法(如MergeSort)中获取想法,并设计解决方案如下:

  1. 将序列分成两半。
  2. 找到两半中增长最长的子序列
  3. 加入两半。
  4. 显然有缺失的部分,但是从这里如何向前推进?

1 个答案:

答案 0 :(得分:1)

你的提议不起作用,因为两半中最长的序列通常不会是连续的,并且当你加入一半时可能存在更长的序列。

您可以按照以下方式解决此问题:

  • 在两半中,找到增长最长的子序列,让L和R;
  • 在两半中,找到最长的增长子序列,左对齐,让LL和RL;
  • 在两半中,找到最长的增长子序列,右对齐,让LR和RR;

  • 最长,如果后者形成递增序列,则保留L,R,LR + RL中最长的;

  • 对于左对齐,保留LL或整个左子序列+ RL,如果这形成一个递增的子序列;
  • 对于右对齐,保留RR或LR +整个右子序列,如果这形成一个递增的子序列。

所有这些操作都在一个递归过程中完成。当你连接两个子序列时,检查它们是否形成一个增加的子序列只需要比较面对的元素。