我目前正在开发一个播放列表播放器,我正面临一个问题。我的播放列表中有可变长度的空白,我想用特殊的音频文件填充。这些文件也有可变长度,通常比我在播放列表中的间隙短。
这听起来像是经典的背包问题,所以我试图实现这个算法。这适用于较小的间隙,但每当我有30分钟的间隙时,算法使用极大的内存量。这是预期的,因为我使用dynamic programming来解决问题。
背包的容量为{gap in milliseconds},背包物品具有音频文件的重量(以毫秒为单位)。
这非常有效。所以我想知道我是否可以使用不同的算法,或者可能将重量和容量更改为较小的变量。到目前为止,我一直在考虑将所有内容除以任意数字,但如果我这样做,则会失去精确度。
任何人都有任何想法?
编辑:
我有大约500个填充物填补空白。并且不可能改变音高。 填料组应该有一个完美的解决方案。 我真的想要毫秒级的精度,但我可以在不到100毫秒的时间内生活。
答案 0 :(得分:1)
你说播放列表所以我假设你有歌曲,一首典型歌曲大约3分钟,所以你的解决方案将是大约10首歌曲。因此,您可以将所有时间除以50,然后歌曲的典型误差将为正或负25毫秒,因此对于10首随机歌曲,误差通常约为(25毫秒* sqrt(10))< 100毫秒。如果你想要更好地保证错误,那么你可以将你的歌曲时间和目标时间分成20或10,但当然如果你把你的时间除以10那么你应该非常非常非常地得到超过100毫秒的错误。除以10意味着您将精确的O(WN)动态编程解决方案的内存除以10,这样它就可以在拟合到内存之间产生差异,而不是在边界线上。
答案 1 :(得分:0)
您可以使用迭代加深近似,您可以使用所有最适合的填充物来填补空白。然后你删除它们(更短到更长),在每个空格后用动态算法求解剩余的空间。由于每次移除都会增加剩余间隙的长度,因此每个问题都会变得更难。一旦耗尽时间或内存就停止,并使用最后生成的解决方案。