【发布时间】:2019-03-04 13:44:57
【问题描述】:
所以这是另一个可能是众所周知的 codility 平台的方法,关于青蛙过河的任务。很抱歉,如果这个问题被问得不好,这是我在这里的第一篇文章。
目标是找到青蛙可以跳到河对岸的最早时间。 例如,给定 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
函数应该返回 6。
示例测试:(5, [1, 3, 1, 4, 2, 3, 5, 4])
完整的任务内容: https://app.codility.com/programmers/lessons/4-counting_elements/frog_river_one/
所以这是我第一个明显的方法:
def solution(X, A):
lista = list(range(1, X + 1))
if X < 1 or len(A) < 1:
return -1
found = -1
for element in lista:
if element in A:
if A.index(element) > found:
found = A.index(element)
else: return -1
return found
X = 5
A = [1,2,4,5,3]
solution(X,A)
这个解决方案是 100% 正确的,在性能测试中得到 0%。
所以我认为更少的行+列表理解会得到更好的分数:
def solution(X, A):
if X < 1 or len(A) < 1:
return -1
try:
found = max([ A.index(element) for element in range(1, X + 1) ])
except ValueError:
return -1
return found
X = 5
A = [1,2,4,5,3]
solution(X,A)
这个也可以工作,性能为 0%,但无论如何它更快。
我还找到了 deanalvero (https://github.com/deanalvero/codility/blob/master/python/lesson02/FrogRiverOne.py) 的解决方案:
def solution(X, A):
# write your code in Python 2.6
frog, leaves = 0, [False] * (X)
for minute, leaf in enumerate(A):
if leaf <= X:
leaves[leaf - 1] = True
while leaves[frog]:
frog += 1
if frog == X: return minute
return -1
此解决方案在正确性和性能测试中达到 100%。
我的问题可能是因为我不太了解这个时间复杂度的事情。请告诉我最后一个解决方案比我的第二个解决方案更好吗?它在 for 循环中有一个 while 循环!它应该很慢,但事实并非如此。
【问题讨论】:
-
自动假设具有更多循环的算法总是较慢是一个常见的错误。此外,您甚至没有计算
index中的隐式循环(这是O(n),因为A是一个无序数组)。
标签: algorithm performance time-complexity