背包算法,大容量

3
我目前正在开发一个播放列表播放器,但遇到了问题。我的播放列表中有不同长度的间隙,我想用特殊的音频文件来填充这些间隙。这些文件也有不同的长度,通常比我在播放列表中的间隙短。
这听起来像是一个经典的背包问题,所以我尝试实现这个算法。对于较小的间隙,这个算法运行得很好,但每当我有一个30分钟的间隙时,算法就会使用极高的内存。这是预料之中的,因为我使用了动态规划来解决这个问题。
背包的容量为{毫秒数的间隔},背包物品的重量为音频文件的毫秒数。
这非常低效。所以我想知道是否可以使用不同的算法,或者将重量和容量变成更小的变量。到目前为止,我考虑将所有东西除以一个任意数,但这样做会失去精度。
有人有什么想法吗?
编辑:
我有大约500个填充物来填补这个间隙。改变音调是不可能的。 这组填充物应该有一个完美的解决方案。 我真的想要毫秒级的精度,但如果有100ms以下的误差,我可以接受。

1
你需要毫秒级的精确度吗?如果是的话,为什么?你控制间隔的长度吗?一点背景知识可以帮助很多。 - patros
空隙一定要最佳填充吗?也许当新的间隙低于某个特定阈值时,你应该停止填充。 - Geobits
这听起来很奇怪。为什么会有30分钟的间隔?为什么它必须完美匹配?音频文件可以轻松地拉伸几个百分点而没有任何明显的差异,也许这能帮到你? - pentadecagon
我已经编辑了原始问题,并加入了一些更多的背景信息。 - Maarten Blokker
预计算值是否可能,还是它是动态的? - Vikram Bhat
问题在解决过程中不会改变,填充长度都是事先已知的! - Maarten Blokker
2个回答

1
您提到了播放列表,我假设您有歌曲,一首典型的歌曲长度约为3分钟,因此您的解决方案将涉及大约10首歌曲。因此,您可以将所有时间除以50,然后歌曲的典型误差将为正负25毫秒,因此对于10首随机歌曲,误差通常为(25毫秒* sqrt(10))<100毫秒。如果您想获得更好的误差保证,则可以将歌曲时间和目标时间除以20或10,但是如果您将时间除以10,则很少会出现超过100毫秒的错误。除以10意味着您将内存除以10,用于精确的O(WN)动态编程解决方案,因此如果您处于边缘状态,则可以使其适合内存而不是超出内存限制。

这是我现在采用的方法,似乎无法进一步改进算法。我打算尝试一些不同的数字,看看哪个效果最好! - Maarten Blokker
"25毫秒"这个数字从哪里来的? - QuestionDriven

0
您可以使用迭代加深逼近的方法,将间隙填满所有最长的填充物以使其合适。然后,按照长度从短到长的顺序将它们移除,并在每次移除后使用动态算法解决剩余的空间。由于每次移除都会增加剩余间隙的长度,因此每个问题都会变得更困难。一旦时间或内存用尽,请使用最后生成的解决方案停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接