输入是按整数时间戳排序的事件数组,输出是将输入数组分为许多部分的索引数组。 输出数组需要是最优的(以下会详细说明)。
struct e {
int Time;
// other values
}
Example Input: [e0, e1, e2, e3, e4, e5, ..., e10]
Example output: [0, 2, 6, 8] (the 0 at the start is always there)
使用上述示例,我可以使用分割索引将原始数组分成5个子数组,如下所示:
[ [], [e0, e1], [e2, e3, e4, e5], [e6, e7], [e8, e9, e10] ]
这个例子解决方案的成本是子数组之间“距离”的总成本。
double distance(e[] arr1, e[] arr2) {
// return distance from arr1 to arr2, order matters so non-euclidean
}
total cost = distance([], [e0, e1]) + distance([e0, e1], [e2, e3, e4, e5]) + ...
在这个阶段,了解实际问题会有所帮助。
输入数组代表某一时间的音乐音符(即MIDI文件),我想将MIDI文件拆分为最佳吉他指法。因此,每个音符的子数组表示和弦(或单个手指组合在一起的旋律)。两个子数组之间的距离表示从一个指法模式移动到另一个指法模式的难度。目标是找到在吉他上演奏歌曲的最简单(最优)方式。
我还没有证明,但我认为这看起来像是一个NP-Complete或NP-Hard问题。因此,如果我能将其缩小到另一个已知问题并使用已知的分治算法就会有帮助。此外,可以使用更传统的搜索算法(A* ?)来解决这个问题。这可能非常有效,因为我们可以比在常规图中更快地过滤掉不好的解决方案(因为输入技术上是一个完整的图,因为任何一个指法都可以从其他任何一个指法到达)。
我无法决定最佳方法是什么,因此目前被卡住了。任何提示或想法都将不胜感激。
[]
,或者有些子数组不允许,或者需要最少的子数组?更具体地说,什么阻止你取整个数组? - kcsquared