关于烙饼排序问题的优化

今天偶然在weixingstudio大侠的blog上看到了烙饼排序问题,研究了一下,做了一点小小的改进,原文地址:

http://blog.csdn.net/weixingstudio/article/details/6912434


比如用35142这个串来研究,递归下去,发现有大量的没有用的(或者说冗余的)交换,比如首次递归,会得到这样的结果:
第一层:53142
第二层:35142
第三层:53142
第四层:35142
……
这个重复一直到Search(step+1)导致111行返回为止。
如果某一层的循环陷入这样的死扣,就只有等到上面这句话发生为止才能终止这个递归分支。
实际上,这个情况是可以预防的,如果在每一次迭代时传入上次迭代的i值,并在本次迭代中跳过相同的i值,则可以消去很多没用的分支,将代码修改如下:

……
Search(0, 0) //原代码第21行
……
void Search(int step, int lastI) //原代码第102行
……
for(i=1;i<m_nCakeCnt;i++)  //源代码第129行
{
    if ( i != lastI )
    {
        Reverse(0,i);
        m_ReverseCakeArraySwap[step]=i;
        Search(step+1, i);
        Reverse(0,i);
    }
}

这样修改之后,再运行,解是一样的,但是搜索次数由原来的2189次减少到了716次。
运行结果如下:


--->begin
32423
 |Search Times|:716
Total Swap times=5




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值