我有一个随机递归回溯算法来生成数独谜题(参见here)。它的平均工作速度足够快,但最坏情况的运行时速度慢得令人无法接受。以下是100次试验的运行时间直方图(以毫秒为单位)(“更多”约为200,000毫秒!):
我想通过在 t ms之后简单地计时并使用新的随机种子重新启动来改进算法。为了防止这种情况无限重复,我会在 n 尝试后停止,或者在每次尝试失败后增加 t 。如果 t 远大于中位数,那么很有可能在后续尝试中获得更快的运行速度。
问题:
答案 0 :(得分:2)
由于您的算法是重新计算的,为什么不建立最大递归深度?如果特定的随机种子导致递归深度,你已经根据经验建立得足够高以至于你会击中长尾,那么就会中止。
通过视觉逼近,看起来在4500毫秒之后,您将无法获得对给定种子的投资的显着回报。重新运行该基准测试还跟踪递归深度,并查看该数字是什么。不过,我会跑100多个样本。
该解决方案与CPU速度无关。
答案 1 :(得分:1)
是的,它被称为 confidence interval 。通过在预处理(或动态)中多次运行算法,您可以确定x%置信度(其中x
是参数) interval 的中位数是什么运行时间在。
您可以通过减少x
或增加算法运行的次数来减小间隔大小。
当然如果你不能真正运行算法本身,你可以尝试在某台机器上对它进行基准测试并找到置信区间(让它为I
),并创建一些函数{{如果在不同的机器(M)上给出不同的算法的定时(它的定时是s),则预测机器M的间隔应该是什么。
发现f(I,s)
以类似的方式完成 - 使用置信区间。
你的方法看起来很好,我可能会做同样的事情 - 我会首先设置一个小因子,并在每次尝试失败后增加它。请注意,这与congestion control in the TCP protocol(来自网络领域)类似,以便通过网络查找已接受的包裹转移率。