簡體   English   中英

Python 提高效率的算法

[英]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 個元素的數字列表。

測試用例是:

  1. foo(列表(范圍(10**5)))
    打印(“好的”)

  2. 打印(富([1,2,4,3]))

  3. 打印(foo([8, 7]))

  4. 打印(富([5]))

  5. 打印(富([3、3、2、1]))

測試用例的預期結果:

  1. [1, 2, 3, 3]
  2. [7, 7]
  3. [5]
  4. [1, 1, 1, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM