1 回答

TA貢獻1943條經驗 獲得超7個贊
有趣的是,您發布了計算機的時鐘速度 - 您可以計算算法所需的實際步驟數……但是您需要對實現有很多了解。例如,在 python 中,每次創建對象或超出范圍時,解釋器都會更新底層對象上的計數器,如果這些 ref 計數達到 0,則釋放內存。相反,您應該查看相對速度。
您發布的第三方示例顯示,當輸入數組長度加倍時,速度小于加倍。好像不太對吧?事實證明,對于這些示例,構建數組的初始工作可能支配了對數組進行排序所花費的時間!
在您的代碼中,已經有一條注釋指出了我要說的內容...
heap.remove(heap.heap[i])
此操作將遍歷您的列表(從索引 0 開始)尋找匹配的值,然后將其刪除。這已經很糟糕了(如果它按預期工作,如果您的代碼按預期工作,您將在該行上進行 320k 比較?。5闆r更糟——從數組中刪除一個對象不是就地修改——刪除對象后的每個對象都必須在列表中向前移動。最后,不能保證您確實刪除了那里的最后一個對象……可能存在重復值!
這是一個有用的網站,列出了 python 中各種操作的復雜性 - https://wiki.python.org/moin/TimeComplexity。為了盡可能高效地實現算法,您需要盡可能多的數據結構操作為 O(1)。這是一個例子......這是一些原始代碼,大概是heap.heap是一個列表......
output = [heap.heap[i]] + output heap.remove(heap.heap[i])
正在做
output.append(heap.heap.pop())
將避免分配新列表并使用恒定時間操作來改變舊列表。(向后使用輸出比使用 O(n) 時間 insert(0) 方法要好得多!如果您確實需要訂單,您可以使用出隊對象進行輸出以獲得 appendleft 方法)
如果您發布了整個代碼,那么我們可能會提供很多其他的小東西。希望這有幫助!
添加回答
舉報