繁体   English   中英

背包算法,大容量

[英]Knapsack algorithm, large capacity

我目前正在开发播放列表播放器,因此遇到问题。 我的播放列表中有可变长度的间隙,我想填充特殊的音频文件。 这些文件的长度也可变,通常短于我在播放列表中的间隔。

这听起来像一个经典的背包问题,所以我尝试实现此算法。 这对于较小的间隙效果很好,但是每当我有30分钟的间隙时,该算法就会使用大量内存。 这是可以预期的,因为im使用动态编程来解决该问题。

背包具有{gap in milliseconds}的容量,背包项目具有以毫秒为单位的音频文件的权重。

这是非常低效的。 所以我想知道我是否可以使用其他算法,或者将权重和容量更改为较小的变量。 到目前为止,我一直在考虑将所有内容除以任意数,但是如果这样做,il会失去精度。

有人有什么想法吗?

编辑:

我有大约500个填充物可以填补空白。 并且无法更改音高。 填充剂组应具有完美的解决方案。 我确实想要毫秒级的精度,但是我可以在100ms以下的时间内生存。

您说的是播放列表,所以我假设您有歌曲,一首典型的歌曲大约需要3分钟,因此您的解决方案将是大约10首歌曲。 因此,您可以将所有时间除以50,然后一首歌的典型错误将为正负25毫秒,因此,对于10首随机歌曲,该错误通常约为(25毫秒* sqrt(10))<100毫秒。 如果要更好地保证错误,则可以将歌曲时间和目标时间除以20或10,但是可以肯定的是,如果将时间除以10,则很少会出现100毫秒以上的错误。 除以10意味着您将针对精确的O(WN)动态编程解决方案将内存除以10,因此它可以使内存适合与否(如果您处于临界点)有所不同。

您可以使用迭代加深近似,在其中用所有适合的最长填充物填充间隙。 然后删除它们(从短到长),然后在每一个之后使用动态算法求解剩余空间。 由于每次清除都会增加剩余间隙的长度,因此每个问题都会更加困难。 一旦时间或内存用完,请停止操作,并使用最后生成的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM