利用Python來解釋時間複雜度的概念與計算

更新於 發佈於 閱讀時間約 7 分鐘

什麼是時間複雜度?

時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。

raw-image

時間複雜度的計算主要基於以下幾個原則:

  1. 忽略常數係數:O(2n) O(n) 視為相同,因為增長趨勢相同。
  2. 只考慮最高次項:O(n^2 + n) 視為 O(n^2)
  3. 巢狀迴圈計算方式: 單層迴圈 -> O(n) 雙層巢狀迴圈 -> O(n^2) 三層巢狀迴圈 -> O(n^3)
  4. 遞迴關係式計算: 例如二分搜尋的遞迴關係為 T(n) = T(n/2) + O(1),推導出 O(log n)

Python 程式範例分析

1. O(1) - 常數時間

# 直接存取陣列元素,無論 n 多大,時間固定
arr = [1, 2, 3, 4, 5]
print(arr[2]) # O(1)

2. O(n) - 線性時間

def linear_search(arr, target):
for num in arr: # 迴圈運行 n 次
if num == target:
return True
return False

3. O(n^2) - 平方時間

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]

4. O(log n) - 對數時間(二分搜尋)

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

5. O(2^n) - 指數時間(斐波那契遞迴)

def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2) # O(2^n)

不同演算法計算相同問題的時間比較

我們使用兩種不同的方法來解決相同問題,並透過 time 模組測量它們的執行時間。

例子:尋找中間值

O(n) - 線性時間(使用 for 迴圈)

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} 秒")
raw-image

O(log n) - 對數時間(二分搜尋法改進版)

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} ")
raw-image
  1. 線性搜尋(O(n))每次都需遍歷整個列表,效率較低。
  2. 內建 max 方法 通常使用最佳化策略,使其效率接近 O(log n) 或更快。
  3. 透過測試時間,我們可以看到不同時間複雜度的演算法在相同問題上的效能差異。


時間複雜度 O(log n) 和 O(n) 之間的理論運行時間差異主要來自增長速率的不同。以數學方式來表示:

  • O(n):運行時間與輸入大小 n 成正比,例如 T(n) ≈ k * n
  • O(log n):運行時間與 log₂(n) 成正比,例如 T(n) ≈ k * log₂(n)

1. 數值比較

假設 n = 1,000,000:

  • O(n) → 1,000,000 步
  • O(log₂(n)) → log₂(1,000,000) ≈ 20 步

這表示在這例子上 O(n) 的方法理論上會比 O(log n) 約 50,000 倍

程式範例 相除約等於1923倍

Python 的 for 迴圈和 list 操作由 C 語言實作,並且可能經過最佳化,使得線性搜尋的實際運行時間比單純的理論計算要短。


總結

  • 時間複雜度能幫助我們估算演算法的效率。
  • 使用 Big-O 記號來表示增長趨勢。
  • 常見的時間複雜度包括 O(1)、O(n)、O(n^2)、O(log n) 等。
  • 設計演算法時應考慮降低時間複雜度,提高效能。

希望這篇文章能幫助你理解 Python 中的時間複雜度概念及計算方式!

留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
149會員
288內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
在物理方程式描述上,很重要的一個概念,是會去採用函數去描述一個物理量的變化,假設我們令一個函數為f(t),假設此函數形式為f(t)=t,那我們將此關係是畫圖,將縱軸訂為f(t),橫軸訂為t,去看這個函數的演變,我們就會發現這個函數f(t)隨著t時間的變化就是線性的變化。 在一般物理上,f(t)指的
Thumbnail
在物理方程式描述上,很重要的一個概念,是會去採用函數去描述一個物理量的變化,假設我們令一個函數為f(t),假設此函數形式為f(t)=t,那我們將此關係是畫圖,將縱軸訂為f(t),橫軸訂為t,去看這個函數的演變,我們就會發現這個函數f(t)隨著t時間的變化就是線性的變化。 在一般物理上,f(t)指的
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
1 引言 微分方程是描述一個系統的狀態隨時間和空間演化的最基本的數學工具之一,其在物理、經濟、工程、社會等各方面都有及其重要的應用。 然而,只有很少的微分方程式可以解析求解,尤其對於偏微分方程,能解析求解的種類更是寥寥可數。 更多的微分方程式可以用數值法來求解,只要精確度夠高,就可以滿足科學和工程
Thumbnail
1 引言 微分方程是描述一個系統的狀態隨時間和空間演化的最基本的數學工具之一,其在物理、經濟、工程、社會等各方面都有及其重要的應用。 然而,只有很少的微分方程式可以解析求解,尤其對於偏微分方程,能解析求解的種類更是寥寥可數。 更多的微分方程式可以用數值法來求解,只要精確度夠高,就可以滿足科學和工程
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
Thumbnail
介紹邏輯運算的觀念,包含布林值、運算子與運算式的介紹。並說明如何使用 Python 撰寫這些觀念。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News