【问题标题】:Minimal number of cuts to partition sequence into pieces that can form a non-decreasing sequence将序列划分为可以形成非递减序列的片段的最小切割数
【发布时间】:2015-11-28 15:26:52
【问题描述】:

我有 N 个整数,例如 3、1、4、5、2、8、7。可能有一些重复。我想将此序列划分为连续的子序列,以便我们可以从它们形成非递减序列。如何计算最小切割数?对于上面提到的例子,答案是 6,因为我们可以把这个序列分成 {3}, {1}, {4, 5}, {2}, {7}, {8} 然后形成 {1, 2 , 3, 4, 5, 7, 8}。最快的方法是什么?

假设某些数字可能相等,有谁知道如何解决它?

【问题讨论】:

  • 为什么这个问题被标记为图论或多重集?例如,如果您认为图表在这里有用,请与我们分享您的发现。就目前而言,您的问题没有显示任何努力或研究
  • 我将其标记为图论,因为许多看起来与图无关的难题在图论中都有解决方案。我不知道如何解决这个问题。
  • @Paul 不,不是。看一下这个例子:3、1、4、5、2、8、7。您的算法会将其划分为 {3}、{1、4、5}、{2、8}、{7},但是我们不能用这些片段制作一个非递减的序列。
  • 这可以被认为是一个决策问题,因为您可以将问题重新表述为:这是我可以对该序列进行的最小切割次数吗?在这种情况下,这可能是 NP-Complete,但我可以看到一些伪多项式动态规划的可能性。

标签: algorithm graph-theory set-theory


【解决方案1】:

我会在值减小的点将数组切割成非递减段,然后将这些段用作(单个)合并阶段的输入 - 就像在排序合并中一样 - 尽可能保持相同的段, 在关系的情况下。当您必须从一个片段切换到另一个片段时,为剪辑创建额外的位置。

输出是排序的,所以这会产生足够的切割来完成这项工作。剪辑是在序列减少的点处产生的,或者在由于原始序列跳过其他地方存在的数字而必须创建间隙的点处产生 - 所以没有所有这些剪辑的序列都不能重新排列成排序顺序。

合并开销的最坏情况是初始序列正在减少。如果您使用堆来跟踪接下来要选择的序列,那么这将变成成本为 n log n 的堆排序。通过从堆中提取所有出现的相同值来处理关系,然后才决定要做什么。

【讨论】:

    【解决方案2】:

    如果列表不包含重复项,则此方法有效。也许这些可以先得到有效的处理。

    我们可以使用 Fenwick 树计算O(n * log n) 时间和O(n) 空间中的置换反转向量。具有相同编号的向量的连续段可以表示不需要切割的部分。不幸的是,它们也可能返回误报,例如,

    Array: {8,1,4,5,7,6,3}
    Vector: 0,1,1,1,1,2,5
    

    63 暗示序列中的剪切,[1,4,5,7]。为了解决这个问题,我们采用第二个反演向量表示每个元素后面的较小元素的数量。两个向量中平行的连续线段不需要切割:

    Array:  {8,1,4,5,7,6,3,0}
    Vector:  0,1,1,1,1,2,5,7  // # larger preceding
    Vector:  7,1,2,2,3,2,1,0  // # smaller following
                |---|  // not cut
    
    Array:   {3,1,4,5,2,8,7}
    Vectors:  0,1,0,0,3,0,1
              2,0,1,1,0,1,0
                 |---|  // not cut
    
    Array:   {3,1,2,4}
    Vectors:  0,1,1,0
              2,0,0,0
               |---|  // not cut
    

    【讨论】:

    • 如果一些数字可以相等怎么办?例如 8、1、4、5、3、7、6、3
    • @user128409235 感谢您的 cmets。我在答案的末尾添加了您的两个重复示例。
    • 1 4 3 1 2 3 4 3 怎么样。你的算法对此不起作用(正确答案是 5,但算法输出 7)。
    • @user128409235 你是对的 - 我还想不出一种方法来使这种方法适用于多个重复项。我会修改答案以反映这一点。
    猜你喜欢
    • 2018-03-17
    • 2011-08-13
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多