1.1 樸素方法的定義
樸素的方法(直接解) — 這是簡單、直接的解決問題的手段,通常並未在時間或空間上進行優化。它們基於基本、明顯的步驟,未考慮到更複雜的優化。
這些方法可以用於對問題的初步理解,或作為比較較複雜算法的基本版本。
優點:
1. 簡單的實現:
樸素的方法通常易於理解和實現,使其成為解決問題的一個好起點。
2. 清晰:
這些方法基於直接的手段,使其易於向新手解釋和理解。
3. 初始評估:
它們可以作為比較較複雜和優化算法的基本版本。
缺點:
1. 低效能:
樸素的方法通常有較高的時間複雜度,使其不適合處理大量數據。
2. 無效率:
由於缺乏優化,它們可能會使用比必要更多的資源。
3. 限制的應用性:
這些方法可能不適用於複雜的任務或需要高效解決方案的任務。
1.2 簡單問題的例子
用樸素的方法解決問題的例子:
檢查數是否為質數:
樸素的方法是檢查數是否可以被所有從 2
到 n-1
的數整除。
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
# 使用範例:
number = 29
print(is_prime(number)) # 輸出: True
計算最大公因數 (GCD):
樸素的方法是檢查所有從 1 到兩數最小值的數,並找到最大因數。
def gcd_naive(a, b):
gcd = 1
for i in range(1, min(a, b) + 1):
if a % i == 0 and b % i == 0:
gcd = i
return gcd
# 使用範例:
a = 48
b = 18
print(gcd_naive(a, b)) # 輸出: 6
1.3 較複雜問題的例子
在字串中尋找子字串:
樸素的方法是逐個檢查字串中每一個可能的子字串位置。
def naive_search(text, pattern):
n = len(text)
m = len(pattern)
for i in range(n - m + 1):
match = True
for j in range(m):
if text[i + j] != pattern[j]:
match = False
break
if match:
return i
return -1
# 使用範例:
text = "hello world"
pattern = "world"
print(naive_search(text, pattern)) # 輸出: 6
尋找最近的點對:
樸素的方法是檢查每對點之間的距離,並找出最小距離。
import math
def closest_pair_naive(points):
min_distance = float('inf')
closest_pair = None
n = len(points)
for i in range(n):
for j in range(i + 1, n):
distance = math.dist(points[i], points[j])
if distance < min_distance:
min_distance = distance
closest_pair = (points[i], points[j])
return closest_pair, min_distance
# 使用範例:
points = [(1, 2), (3, 4), (5, 6), (7, 8)]
print(closest_pair_naive(points)) # 輸出: ((1, 2), (3, 4)), 2.8284271247461903
所有這些算法都可以改進,但在改進之前 — 請先寫出一個直接的解決方案。也許,如果你只需要調用一兩次,它就已經足夠了。
解決方案越簡單,錯誤和隱藏問題就越少。在簡單的解決方案中,很容易添加新功能。這樣的代碼易於閱讀和理解。過早的優化是萬惡之源。
GO TO FULL VERSION