機率分析與集中不等式

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 最小割
  • ✅ 機率分析
  • ✅ 集中不等式驗證

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!