【发布时间】:2008-11-25 13:43:57
【问题描述】:
自从我在学校上算法课已经有一段时间了,如果我的术语不准确,请原谅我。
我有一系列动作,在运行时会产生一些所需的状态(它基本上是一组重现错误的步骤,但就这个问题而言,这并不重要)。
我的目标是找到仍能产生所需状态的最短步骤系列。任何给定的步骤都可能是不必要的,因此我正在尝试尽可能有效地删除这些步骤。
我想保留步骤的顺序(这样我可以删除步骤,但不能重新排列它们)。
我采取的幼稚方法是采取整个系列并尝试删除每个操作。如果我成功地删除了一个动作(不改变最终状态),我会从系列的开头重新开始。在最坏的情况下,这应该是 O(n^2)。
我开始尝试提高效率的方法,但我很确定这是一个已解决的问题。不幸的是,我不确定谷歌到底是什么——这个系列并不是真正的“路径”,所以我不能使用路径缩短算法。任何帮助——即使只是给我一些搜索条件——都会有所帮助。
更新:有几个人指出,即使是我的幼稚算法也找不到最短的解决方案。这是一个很好的观点,所以让我稍微修改一下我的问题:关于同一问题的近似算法的任何想法?我宁愿有一个快速接近最短解决方案的简短解决方案,也不愿花很长时间来保证绝对最短的系列。谢谢!
【问题讨论】:
-
我所描述的分治法应该可以作为具有许多不相关步骤的大 n 的近似值,就像我在扩展答案中指出的那样。
-
我不明白你为什么说调试无关紧要:如果是,那么 Delta Debugging 将帮助您自动最小化一组导致源代码更改的输入 OR 的失败正如 Hasturkun 所指出的,隔离错误等。请澄清。
标签: algorithm