[英]Python Algorithm to Improve Efficiency
def foo(numbers):
result = []
for i in range(len(numbers)):
sub = sorted(numbers[i:])
result.append(sub[0])
return result
需要重寫上面提到的 function foo(numbers) 的漸近最有效的實現。 function 不得修改參數號。
實現必須能夠在不到一秒的時間內處理包含 10^5 個元素的數字列表。
測試用例是:
foo(列表(范圍(10**5)))
打印(“好的”)
打印(富([1,2,4,3]))
打印(foo([8, 7]))
打印(富([5]))
打印(富([3、3、2、1]))
測試用例的預期結果:
我的第一次嘗試是使用遞歸,但代碼運行器禁止排序 function 並且代碼沒有通過 10^5 元素測試:
def foo(numbers):
if len(numbers) <= 1:
return [(sorted(numbers))[0]]
else:
return [(sorted(numbers))[0]] + foo(numbers[1:])
我的第二次嘗試是使用插入排序。 它通過了 10^5 元素測試,但沒有得到所有想要的結果
def foo(numbers):
for i in range(len(numbers)):
num = numbers[i]
j=i
while j >= 1 and numbers[j-1] > num:
numbers[j] = numbers[j-1]
j -= 1
numbers[j] = num
return numbers
解決從最后一個索引到第一個索引的問題,每次用當前數字更新當前最小值。
def foo(numbers):
result = []
tmp = numbers[::-1]
mn = tmp[0]
for i in range(len(numbers)):
mn = min(mn,tmp[i])
result.append(mn)
result = result[::-1]
return result
這似乎滿足了簡報:
import time
def foo(numbers):
mn = numbers[-1]
return [mn := min(mn, t) for t in numbers[::-1]][::-1]
s = time.perf_counter()
foo(list(range(10**5)))
e = time.perf_counter()
print(f'Duration: {e-s:.4f}s')
print(foo([1,2,4,3]))
print(foo([8,7]))
print(foo([5]))
print(foo([3,3,2,1]))
Output:
Duration: 0.0190s
[1, 2, 3, 3]
[7, 7]
[5]
[1, 1, 1, 1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.