【发布时间】:2016-11-07 17:17:24
【问题描述】:
好吧,我正在寻找方法来优化我在 python 中作为这个问题的答案而编写的函数:
“给定一个整数方阵,每行包含到达开始所花费的时间,第一人称,第二人称,...,最后一个人,以及按该顺序退出。行的顺序如下相同的模式(开始,每个人,退出)。接人是瞬间的,可以重新访问不同的地点,移动到出口并不意味着你必须立即离开 - 可以往返于出口在时间允许的情况下接更多的人。有些路径会将时间添加到时钟。添加时间到时钟会延迟出口门的关闭,如果时间回到 0 或门已经关闭后的正数关闭,它会触发出口重新打开。因此,可能会绕一圈并不断获得时间:即每次遍历路径时,使用或添加相同的时间量。
目标是编写一个函数来计算最多可以接走的人以及他们是哪些人,同时仍然在门关闭之前从出口逃跑。该函数应该返回返回已保存人员的索引排序的顺序。 "
我写的函数是:
def answer(times,time_limit):
mindic=min(min(times))
n=len(times)
def find_path(times, start, end,time, path=[]):
if start != 0 and start != end :
if start-1 in path:
pass
else:
path = path + [start-1]
if start == end and time-min(times[start][0:len(times[start])-1]) < mindic:
return path
best=None
for i in range(n):
if time-times[start][i] >= mindic and times[start][i] != 0 :
newpath = find_path(times, i, end,time-times[start][i], path)
if newpath != None :
if not best or len(newpath) > len(best):
best=newpath
return best
res=find_path(times,0,n-1,time_limit)
return res
调用函数会是这样的:
answer([[0, 1, 1, 1, 1], [1, 0, 1, 1, 1], [1, 1, 0, 1, 1], [1, 1, 1, 0, 1], [1, 1, 1, 1, 0]],3)
上面例子的答案是:
[0, 1]
它只能保存索引为 0 和索引为 1 的人。
使用 '%% timeit 10' 运行函数会得到以下结果:
1000 loops, best of 3: 180 µs per loop
有什么办法可以减少时间?
编辑:感谢@quantummind,从 221 µs 到 180 µs。
EDIT2:@user2357112:我相信我已经解决了问题?现在它不会拒绝两次访问同一地点的路径。
【问题讨论】:
-
快速浏览一下,您的函数似乎都不正确。它确实
if len(path) != len(set(path)): return,拒绝访问同一地点两次的所有路径,即使可能需要重新访问位置。 -
我投票结束这个问题,因为它属于 CodeReview,而不是 StackOverflow。
标签: python optimization graph dynamic-programming