【发布时间】:2012-12-15 08:53:01
【问题描述】:
我有两个列表:源列表和目标列表。两个列表都包含所有相同的项目,但列表的顺序不同。鉴于这两个列表,我需要在源列表上找到一系列交换操作,将列表中的一个项目与另一个项目交换,最终以与目标列表相同的顺序结束源列表。
我正在编写一个脚本,按专辑随机播放 MPD 播放列表,因为默认情况下 MPD 中没有此功能。该脚本当前获取当前播放列表(源列表),执行列表的自定义随机播放,并以新的歌曲顺序(目标列表)结束。然后,该脚本会从播放列表中删除所有项目,并按照新的打乱播放列表的顺序将它们重新插入到播放列表中。删除和添加所有歌曲是一项缓慢的操作。 MPD 库为播放列表中的两首歌曲提供了更快的就地交换,但我不知道如何找到正确的一系列交换操作来将源列表转换为新的随机列表。
这是用 Haskell 编写的,但任何语言/伪代码的答案都可以。
【问题讨论】:
-
MPD 是否只允许按索引交换相邻元素或任意元素对?如果是后者,索引数组上的 Knuth-Fisher-Yates 洗牌会做得很好。
-
算法的输入是什么?你有交换前后的初始和最终索引吗?
-
@DanielFischer:mpd.wikia.com/wiki/MusicPlayerDaemonCommands#swap 按索引表示任意元素对。所以,这听起来对我来说是一个很好的答案。 :-)
标签: arrays haskell pseudocode