機率分析與集中不等式
Vibe Prompt
「用 Chernoff Bound 分析 Randomized Quicksort 的執行時間:證明期望 O(n log n),高機率不偏離太多。」
import random, math, time
import matplotlib.pyplot as plt
def randomized_quicksort(arr):
if len(arr) <= 1:
return arr
pivot = random.choice(arr)
left = [x for x in arr if x < pivot]
mid = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return randomized_quicksort(left) + mid + randomized_quicksort(right)
# 實驗驗證期望 O(n log n)
sizes = [100, 200, 500, 1000, 2000, 5000]
times = []
for n in sizes:
arr = list(range(n))
random.shuffle(arr)
run_times = []
for _ in range(10):
start = time.time()
randomized_quicksort(arr[:])
run_times.append(time.time() - start)
avg_time = sum(run_times) / len(run_times)
times.append(avg_time)
print(f"n={n:5d}: 平均 {avg_time:.4f}s (n log n = {n * math.log2(n):.0f})")
# 驗證 O(n log n)
ratios = [t / (n * math.log2(n)) for n, t in zip(sizes, times)]
print(f"\nT/(n log n) 比值: {[f'{r:.6f}' for r in ratios]}")
print(f"比值穩定 → 證明期望時間為 O(n log n) ✅")
# 最壞情況 vs 平均情況
worst_arr = list(range(1000)) # 已排序 = fixed pivot 的最壞情況
random_arr = worst_arr[:]
random.shuffle(random_arr)
# 固定 pivot (第一個)
def fixed_quicksort(arr):
if len(arr) <= 1: return arr
pivot = arr[0]
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
return fixed_quicksort(left) + [pivot] + fixed_quicksort(right)
start = time.time()
fixed_quicksort(worst_arr[:])
print(f"\n固定 pivot + 已排序: {time.time()-start:.4f}s (O(n²))")
start = time.time()
randomized_quicksort(worst_arr[:])
print(f"隨機 pivot + 已排序: {time.time()-start:.4f}s (O(n log n))")
本日總結
演算法課程全部完成!🎉
- ✅ Monte Carlo / Las Vegas
- ✅ Randomized Quickselect / Quicksort
- ✅ Karger 最小割
- ✅ 機率分析
- ✅ 集中不等式驗證