簡體   English   中英

什么方法最能降低這個問題的時間復雜度

[英]what approach is best to decrease the time complexity of this problem

我想通過聲明我仍在學習數據結構和算法的基礎知識來為這個主題做序,我不是在尋找解決這個問題的正確代碼,而是在尋找正確的方法。 這樣我就可以了解什么情況需要哪種數據結構。 話雖如此,我現在將嘗試正確解釋這段代碼。

下面的代碼是我為中級 leetcode 問題編寫的解決方案。 請查看鏈接以閱讀問題

如果我錯了請糾正我,目前這個算法的時間復雜度是 O(n)

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]):
        startingStation = 0
        didCircuit = -1
        tank = 0
        i = 0
        while i <= len(gas):
            if startingStation == len(gas):
                return -1
            if startingStation == i:
                didCircuit += 1
            if didCircuit == 1:
                return startingStation
            tank += gas[i] - cost[i]
            if tank >= 0:
                i += 1
            if i == len(gas):
                i = 0
            if tank < 0:
                didCircuit = -1
                startingStation += 1
                i = startingStation
                tank = 0

代碼運行良好,但時間復雜度太慢,無法遍歷每個測試用例。 我要問的是如果這個算法是 O(n) 我可以使用什么方法來使這個算法的運行時復雜度為 O(log(n)) 或更快?

附帶問題 - 我知道有很多 if 語句是糟糕且丑陋的代碼,但是如果所有迭代都是 O(1),如果縮放到高迭代計數,if 語句的數量是否會對這個 function 的性能產生任何影響?

“如果我錯了請糾正我,目前這個算法的時間復雜度是 O(n)”

該算法是 O(n^2) 而不是 O(n)。 在最好的情況下,它只會在 while 循環的“n”次迭代中返回一個答案,但在沒有答案的情況下,它需要運行循環 (n*(n+1))/2 次。

O() 符號告訴我們忽略 n 的實際值,並刪除隨着 n 變得非常大而變得無關緊要的項。 所以我們在迭代中忽略 +n 和 /2,最重要的部分是 n^2。

所以它是一個 O(n^2) 算法。

“如果所有迭代都是 O(1),如果縮放到高迭代計數,if 語句的數量是否會對這個 function 的性能有任何影響”

不,算法的 O() 不受邏輯語句數量的影響,但要注意隱藏循環和昂貴的操作。 例如,一個邏輯語句if x in list可以是 O(n) 列表中的項目數而沒有數據特定的優化,所以如果你有一個 O(n) 循環(對於同一個列表)你可以有一個 O(n^2) 算法。 您的邏輯語句都沒有這個問題,您可以出於 O() 目的忽略它們。

作業可以同樣對待。

“我要問的是,如果這個算法是 O(n),我可以使用什么方法來使這個算法的運行時復雜度為 O(log(n)) 或更快?”

由於該算法不是 O(n),最好問問您如何到達那里。 您可以通過找到一種不必多次循環 arrays 的方法來實現。

你問的是數據結構,卻說的是時間復雜度。

在這種情況下,最好的算法在時間上是 O(n),在額外空間上是 O(1)。 除了兩個 arrays 之外,它還需要你存儲一個 integer。如果你不斷從數據流中讀取 gas 和成本值,你甚至可以用三個整數存儲來實現它。

“我不是在尋找解決這個問題的正確代碼,而是在尋找正確的方法”

他們給你的禮物是任何成功的解決方案都是獨一無二的。 由此我們知道,可用的gas量不超過所有成本的總和加上一個站的成本和gas之間的最小差值。 如果不是這樣,那么循環中將有兩個點可以開始。

這意味着一旦我們找到一個i ,其中 0 到i站的可用汽油總和超過從 0 到i的旅行成本,我們就會找到唯一的起始點 position。如果我們到達該行的末尾並且有沒有找到這個,我們知道不可能對任何起始 position 這樣做。

暫無
暫無

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

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