我有一个(播放)列表(A)不同长度的影片剪辑( a1,...,)。我想创建一个新列表(B),其中剪辑( b1,...,bm )与(A)
还有一个限制 MAX_LEN ,(B)中的 bx 可能超出限制。只有a中的相邻剪辑可以连接( a1 + a2 + a3 是合法连接, a1 + a3 不是)。 (A)中的所有剪辑必须在(B)中出现一次,并且必须按照(A)中出现的顺序
最佳解决方案主要:
1)最小化(B)中的剪辑数量。
和次要:
2)最大化(B)中最短片段的持续时间。
主要约束 1)比 2)更重要,因此对于2种不同的解决方案 S1 和 S2 其中NumOfClips( S1 )< NumOfClips( S1 )然后 S1 比 S2 更“优化”,即使durationOfShortestClip( S1 )< durationOfShortestClip(的 S2 )。
以下示例显示输入列表(A)三种可能的输出(B1)和(B2)和 (B3)即可。较弱的(B1)或(B2)履行 1)(尽管(B2)是比<更好的解决方案strong>(B1),因为25> 23)最佳解是(B3)。
我想知道如何以有效的方式找到最佳解决方案? 其他帮助完整的信息/线索,如最佳子问题的存在或不存在等,也受到赞赏。
答案 0 :(得分:0)
for realize你可以使用贪心算法的主要约束。因为你应该将(A)中的第一个元素剪辑设置为(B)中的第一个元素,现在如果你在第一个元素(B)中有空的空间,那么第二个元素剪辑在(A)中可以设置第一个元素是(B),所以这样做,否则设置为B中的第二个元素。 重复此解决方案,将(A)中的所有剪辑设置为(B)中出现一次。 在这个结果中,你可以通过o(n)最小化(B)中的剪辑数量。 为了获得最佳解决方案,您实现了次要约束,您应该最大化最短的持续时间。 假设贪婪算法提供B,B(i)是list中的第i个元素项。很明显B(i)中没有剪辑不能出现在B(i-1)中,所以只有b(i)中的最后成员)可以出现在b(i + 1)中。 所以检查移动是否最大化(B)中最短剪辑的持续时间。
答案 1 :(得分:0)
一个非常模糊的想法,但它至少证明你的问题是多项式的。我的解决方案是O(N^3 * log N * log L)
种类,其中L是所有剪辑长度的总和。
首先找到适当的最小可能数量的剪辑组G
- 这非常简单。只是在第一组中尽可能多地放置剪辑,然后继续使用下一个剪辑。这肯定会产生G
的最小值(即标准1)。但是,仍然可以找到符合标准2)的最优性。
这是怎么回事:
mat[i][j]
的矩阵mat[i][j] = 1
iff索引在i
和j
之间的剪辑的总和小于MAX_LEN
。 mat
中的所有其他值均为0. log L
因子。假设在给定步骤中,所选值为M
mat
复制为copy_mat
。 copy_mat[i][j] = 1 <=> mat[i][j] = 1 and SUM(clips i..j) >= M
G
的幂。如果以最简单的方式实现,矩阵乘法给出因子N^3
。提高功率会增加额外的log N
因素。copy_mat[1][N] = 1
然后有M
的解决方案,请尝试增加它。否则 - 减少。当二进制搜索完成时,它将找到M
的最佳值。如果你需要找到确切的分组,你需要在进行矩阵乘法时使用一个辅助矩阵,但我认为你应该能够自己弄清楚最后一点。
我将继续考虑更快的解决方案,但我的至少证明你的问题在复杂性方面不是指数级的,并且可以相对快速地处理大约1000个剪辑的数量。