我的代码很短,迭代次数少于另一次,但仍然会在codechef.com上接受其他代码时超出时间限制错误。这些代码是codechef.com上“模糊排列”问题的解决方案 为什么这段代码:
def inverse(data,x):
temp=[]
for i in range(x):
temp.append(0)
for i in range(x):
temp[data[i]-1]=i+1
return temp
def main():
while 1:
x=input()
if not x:
return
data=raw_input().split(' ')
for i in range(len(data)):
data[i]=int(data[i])
temp = inverse(data,x)
if temp==data:
print 'ambiguous'
else:
print 'not ambiguous'
if __name__ == "__main__":
main()
比这段代码更快:
while True:
output=[]
n= input()
if n==0: break
caseList= raw_input().split()
amb=1
for i in range(1, n+1):
output.append(str(caseList.index(str(i))+1))
if output==caseList:
print ("ambiguous")
else:
print ("not ambiguous")
请帮帮我......
答案 0 :(得分:3)
我认为你的第二个代码不在函数内部。
访问函数中的局部变量要比访问全局变量快得多。这意味着在全局范围内运行的代码总是可能会更慢。
答案 1 :(得分:2)
当出现这样一致的时间差时,我们不会谈论速度慢2或3倍的东西 - 如果一种方法通过,而另一种方法总是超时,那么这是一个巨大的时间差 - 通常与算法有关复杂性。
虽然第一个代码有足够的空间来改善(例如,使用xrange而不是范围),但在最终数组中,结果是通过随机访问更新,直接由data[i] - 1
计算的索引进行更新 - 在第二个代码段中,使用caseList.index(str(i))
检索每个索引。 “index”lisr方法从列表开始执行线性搜索。它可能看起来很少,但是当它对列表中的每个元素进行处理时,你的O(N)算法变为O(N²) - 它以第二种形式表现出明显的速度。
答案 2 :(得分:1)
看起来你正在使用其他代码正在使用整数的字符串,这会减慢你的速度。