時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。
時間複雜度的計算主要基於以下幾個原則:
O(2n)
與 O(n)
視為相同,因為增長趨勢相同。O(n^2 + n)
視為 O(n^2)
。O(n)
雙層巢狀迴圈 -> O(n^2)
三層巢狀迴圈 -> O(n^3)
T(n) = T(n/2) + O(1)
,推導出 O(log n)
。# 直接存取陣列元素,無論 n 多大,時間固定
arr = [1, 2, 3, 4, 5]
print(arr[2]) # O(1)
def linear_search(arr, target):
for num in arr: # 迴圈運行 n 次
if num == target:
return True
return False
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n - i - 1): # 巢狀迴圈 O(n^2)
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2) # O(2^n)
我們使用兩種不同的方法來解決相同問題,並透過 time
模組測量它們的執行時間。
import time
def find_middle_linear(arr):
middle_index = len(arr) // 2
for i in range(len(arr)):
if i == middle_index:
return arr[i]
arr = list(range(100000000))
start = time.time()
arr = find_middle_linear(arr)
end = time.time()
print(f"搜尋到{arr} O(n) 線性搜尋中間值時間: {end - start:.10f} 秒")
import time
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return print(arr[mid])
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
arr = list(range(100000000))
target = arr[len(arr) // 2] # 目標為中間值
start = time.time()
binary_search(arr, target)
end = time.time()
print(f"O(log n) 真正二分搜尋時間: {end - start:.10f} ")
max
方法 通常使用最佳化策略,使其效率接近 O(log n) 或更快。時間複雜度 O(log n) 和 O(n) 之間的理論運行時間差異主要來自增長速率的不同。以數學方式來表示:
T(n) ≈ k * n
。T(n) ≈ k * log₂(n)
。假設 n = 1,000,000:
這表示在這例子上 O(n) 的方法理論上會比 O(log n)
慢 約 50,000 倍。
Python 的 for
迴圈和 list
操作由 C 語言實作,並且可能經過最佳化,使得線性搜尋的實際運行時間比單純的理論計算要短。
希望這篇文章能幫助你理解 Python 中的時間複雜度概念及計算方式!