昨天做了一道算法题给大家分享了下我的解法,有给出建设性意见的,有支持的还有看得一知半解的。自己想了想的确有可以优化的地方,贴出优化方案。原题和解答过程在这里http://www.cnblogs.com/xianyudotnet/p/5887304.html。
题目要点:
给出一个0,1矩阵,矩阵中的1就是路径,左右移动消耗体力1,上移消耗3,下移不消耗。给定一个体力值求左上角到右上角的最小消耗路径。为了方便测试建立了一个8*8的矩阵如图。
路径是这样的
原方法的结果:
上一篇中解题思路就是:递归模拟路径的移动,探索出给定体力值所有可移动路径,然后选取体力消耗最小的路径。
我修改了一下代码,控制了输入输出,就跑上图的矩阵用于对比测试,结果是这样的。
优化方案:
1.首先解决循环路径问题。原方法中只要体力没消耗完,循环路径依然循环直至体力消耗完毕,这是相当的不科学。于是移动后检查当前坐标是否在路劲中,在说明循环了,直接放弃此路径。
2.其次是体力值问题。如果已经有找到一条可行路径且得知消耗了体力p,那么接下来所有移动后消耗体力大于p的路径也放弃。
有同学提到从最小体力值不断增加循环做递归直到找到路径则这个体力值就是最优解。当然是可行的,但是解很靠后的话,效率是不如原方法固定体力值。后来我又提到用分治的方法固定体力值,后来发现我也是naive了。因为一次递归如果找出解那就是最优了,没找出再调整体力范围,再递归查找,重复计算太多,而且是针对原方法的情况。新方法第二条优化已经是动态调整体力限制,外部再调整体力范围没有意义且作用不大。所以优化后的效率是这样的。
优化结果:
代码:
好多人说用这种算法,那种算法,一大堆名词。。。我看着那些公式真的头疼。我有时间和精力一定努力提高自己学习先进姿势水平。我的野生算法就是这样,经过优化后感觉效率也还说得过去吧。
想测试的依旧github上自取,两个版本的代码都有:https://github.com/631320085/Algorithm
这题我觉得再提高,可能就是要用数据结构那一套,建立路径模型,用上高大上的公式分分钟屌炸天是吧。我今后努力试试。