我希望遍歷串列中的每三個元素。但是在考慮 Big-O 表示法時,Big-O 復雜度是 O(n),其中 n 是串列中的元素數,還是 O(n/3) 每三個元素?
換句話說,即使我指定串列應該只在每三個元素上迭代一次,Python 是否仍然遍歷整個串列?
示例代碼:
def function(lst):
#iterating over every third list
for i in lst[2::3]:
pass
uj5u.com熱心網友回復:
使用 Big-O 表示法時,我們會忽略函式前面的任何標量倍數。這是因為該演算法仍然需要“線性時間”。我們這樣做是因為 Big-O 表示法考慮了演算法在擴展到大輸入時的行為。
這意味著演算法是否考慮串列的每個元素或每三個元素都無關緊要,時間復雜度仍然與輸入大小成線性比例。例如,如果輸入大小加倍,則無論您是查看每個元素還是每三個元素,執行時間都會加倍。
在數學上我們可以這樣說,因為定義中的 M 項(https://en.wikipedia.org/wiki/Big_O_notation):
abs(f(x)) <= M * O(f(x))
uj5u.com熱心網友回復:
大 O 符號將在這里保持 O(n)。
考慮以下:
n = some big number
for i in range(n):
print(i)
print(i)
print(i)
做 3 個動作算作 O(3n) 還是 O(n)?在)。執行三個操作而不是一個操作會降低現實世界的性能嗎?絕對地!
Big O 表示法是關于查看函式的增長率,而不是關于物理運行時間。
考慮來自熊貓庫的以下內容:
# simple iteration O(n)
df = DataFrame([{a:4},{a:3},{a:2},{a:1}])
for row in df:
print(row["a"])
# iterrows iteration O(n)
for idx, row in df.iterrows():
print(row["a"])
# apply/lambda iteration O(n)
df.apply(lambda x: print(x["row"])
所有這些實作都可以被視為 O(n)(常量被洗掉),但這并不一定意味著運行時將相同。事實上,方法 3 應該比方法 1 快 800 倍左右(https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06)!
另一個可能對您有幫助的答案:為什么常量總是從大 O 分析中洗掉?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367967.html
