用于将电影列表连接到长度不大于给定数字的新连接电影列表的算法

时间:2013-01-08 11:23:17

标签: algorithm

我有一个(播放)列表(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)example of input and output lists

我想知道如何以有效的方式找到最佳解决方案? 其他帮助完整的信息/线索,如最佳子问题的存在或不存在等,也受到赞赏。

2 个答案:

答案 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索引在ij之间的剪辑的总和小于MAX_LENmat中的所有其他值均为0.
  • 您可以对所有组中的最小剪辑总和进行二进制搜索。此步骤在我的算法中给出log L因子。假设在给定步骤中,所选值为M
  • mat复制为copy_matcopy_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个剪辑的数量。