Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将序列分割成可以形成非递减序列的片段的最小切割数_Algorithm_Graph Theory_Set Theory - Fatal编程技术网

Algorithm 将序列分割成可以形成非递减序列的片段的最小切割数

Algorithm 将序列分割成可以形成非递减序列的片段的最小切割数,algorithm,graph-theory,set-theory,Algorithm,Graph Theory,Set Theory,我有N个整数,例如3,1,4,5,2,8,7。可能有一些重复的。我想把这个序列分成连续的子序列,这样我们就可以从中形成非递减序列。如何计算最小切割数?对于上面提到的例子,答案是6,因为我们可以将这个序列划分为{3}、{1}、{4,5}、{2}、{7}、{8},然后形成{1,2,3,4,5,7,8}。最快的方法是什么 假设某些数字可能相等,有人知道如何解决吗?我会在值减少的点将数组切割成非递减段,然后将这些段作为输入输入到(单个)合并阶段-就像在排序合并中-在可能的情况下,保持相同的段。当必须从一

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


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

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

输出已排序,因此这将产生足够的切割来完成此工作。切割是在序列减少的点产生的,或者在必须创建间隙的点产生的,因为原始序列跨越其他地方存在的数字-因此没有所有这些切割的序列都不能重新排列为排序顺序


合并开销的最坏情况是初始序列减少。如果您使用堆来跟踪下一步要拾取的序列,那么这将变成heapsort,代价为n log n。通过从堆中提取相同值的所有匹配项,然后决定要做什么来处理关系。

如果列表中不包含重复项,则此方法有效。也许可以先有效地解决这些问题

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

Array: {8,1,4,5,7,6,3}
Vector: 0,1,1,1,1,2,5
如果
6
3
表示序列中的剪切,
[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

为什么这个问题被标记为图论或多重集?例如,如果您认为图表在这里很有用,请与我们分享您的发现。就目前情况而言,你的问题没有表现出任何努力或研究。我把它称为图论,因为许多看起来与图无关的难题都有图论的解决方案。我不知道如何解决这个问题。@Paul不,不知道。看看这个例子:3,1,4,5,2,8,7。你的算法会把它分为{3}、{1,4,5}、{2,8}、{7},但是我们不能用这些片段做一个非递减序列。这可以被认为是一个决策问题,因为你可以把这个问题重新表述为:这是我能对这个序列进行的最小切割数吗?在这种情况下,这可能是NP完全的,但我可以看到一些伪多项式动态规划的可能性。如果一些数字可以相等呢?例如8,1,4,5,3,7,6,3@user128409235谢谢你的评论。我在我的答案末尾添加了两个重复的例子。那么143143呢。您的算法对此不起作用(正确答案是5,但算法输出7)。@user128409235您是对的-我还没有想到一种方法可以使这种方法适用于多个副本。我将修改答案以反映这一点。