回溯算法的每个递归步骤中的操作顺序在特定算法的效率方面有多重要?
对于前。
在骑士之旅中的问题。
骑士被放置在空板的第一块上,然后移动 根据国际象棋的规则,必须完全访问每个广场一次。
在每个步骤中,有8种可能的(一般)移动方式。
int xMove[8] = { 2, 1, -1, -2, -2, -1, 1, 2 };
int yMove[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
如果我改变此订单,就像......
int xmove[8] = { -2, -2, 2, 2, -1, -1, 1, 1};
int ymove[8] = { -1, 1,-1, 1, -2, 2, -2, 2};
现在, 对于一个n * n板 最高n = 6 操作顺序不会影响执行时间的任何可见变化,
但如果是n> = 7
第一个操作(移动)顺序的执行时间远远小于后一个。 在这种情况下,生成所有O(m!)操作顺序并测试算法是不可行的。那么我如何确定这些算法在特定移动顺序上的性能,或者更确切地说如何能够达到一个(或一组)操作顺序,使得算法在执行时间方面更有效。
答案 0 :(得分:1)
从Math / CS的角度来看,这是一个有趣的问题。肯定存在对给定n
最有效的置换(或置换集)。我不知道在所有n
中是否存在最有效的排列。我猜不会。在所有n
中,可能存在更“平均”(但是您定义的)更好的排列。
如果我的任务是找到有效的排列,我可以尝试执行以下操作:我将生成一个固定数量x
的随机生成的移动顺序。衡量他们的效率。对于每个随机生成的移动集,随机创建固定数量的排列靠近原始移动。计算他们的效率。现在你有比你开始时更多的排列。取最佳x
表演者并重复。这将提供一些局部最大化算法,但我不知道它是否导致全局最大化算法。