簡體   English   中英

如何減少列表遍歷器的執行時間限制

[英]How to decrease execution time limit for a list-traverser

我正在處理關於代碼信號的 Python 問題,我試圖查看給定列表是否是一個嚴格遞增的序列,當只刪除一個元素時。 所以我構建了代碼,在 for 循環中,從列表中刪除元素i並檢查它是否是一個遞增序列,然后在該確切索引處替換該元素並重新開始。 這是代碼:

def almostIncreasingSequence(sequence):

    for i in range(len(sequence)):
        element = sequence[i]
        del sequence[i]

        if all(i < j for i, j in zip(sequence, sequence[1:])):
            return True
        sequence.insert(i, element)

    return False

該代碼運行良好,但會導致執行時間錯誤。 有什么辦法可以改進這個現有的代碼,讓它運行得更快?

遍歷列表會更快,將每個值與前一個值進行比較以確保它嚴格增加。 允許列表中的一個數字不為真,並跳過這個數字。 不幸的是,事情並沒有那么簡單,我們可以在下面看到:

不起作用(例如 [1,4,2,3])

def almostIncreasingSequence(sequence):
    lastValue = sequence[0]
    removed_value = False
    for i in range(1,len(sequence)):
        if sequence[i] <= lastValue:
            if removed_value:
                return False
            else:
                removed_value = True
        else:
            lastValue = sequence[i]
    return True

相反,如果遇到不增加,我們需要涵蓋兩種可能性:刪除當前數字(例如 [1,2,1,3])或刪除前一個(例如 [1,2,8,4] )。 我們還有一些邊緣情況用於刪除列表中的第一個或最后一個數字。

最終(不太漂亮)解決方案

def almostIncreasingSequence(sequence):
    lastValue = sequence[0]
    skipped_value = False
    for i in range(1,len(sequence)):
        if sequence[i] <= lastValue:
            if i+1 == len(sequence):
                return not skipped_value # last number is not decreasing, skip if we can
            if skipped_value: 
                # if we've already skipped a number - won't work
                return False
            elif sequence[i+1] > sequence[i-1]:
                # skipping the current number will fix it
                skipped_value = True
                lastValue = sequence[i-1]
            else:
                # try and skip the previous number
                skipped_value = True
                if i == 1 or sequence[i] > sequence[i-2]:
                    # can skip the previous number and it'll work
                    lastValue = sequence[i]
                else:
                    # we have no chance
                    return False  
        else:
            lastValue = sequence[i]
    return True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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