Divide and Conquer

分治(Fun & Jizz)

把原本的大問題遞迴分解成數個小問題,直到問題簡單到可以解決,再合成小問題的答案得到大問題的解。

快速冪

  • 問題:給定 x, y, n,求 (x^n)%y ?
  • 方法:如果直接把 x 自乘 n 次,那複雜度就是有點悲劇的 O(n)。
    觀察發現,可以依照 n 的情況做分類:
    • n 是偶數:x^n = (x^(n/2))^2
    • n 是奇數:x^n = (x^(n/2))^2 * n
      於是複雜度就是 O(log n)

 

費氏數列

  • 數列的每一項 f(n) = f(n-1) + f(n-2)
  • 前幾項是 1, 1, 2, 3, 5, 8......
  • 如果直接用分治寫,當 n 趨近於無限大時,n-1 會和 n-2 差不多大,因此每個問題都拆成兩個小問題,複雜度是 O(2^n)

 

Binary Search

二分搜

對於一個從小到大排序的數列 (長度 n),如果要詢問一個數字 x 是否在裡面,可以先拿出中間的數與 x 比較。如果 x 比較大,就縮小範圍只搜尋右半部,相反就搜尋左半部。

 

如此一來,每次的搜尋範圍都會減半,複雜度是 O(log n)

 

TIOJ 1432 骨牌遊戲

Exercises

Uva

  • 374 (裸快速冪)
  • 12097
  • 1644
  • 1152

TIOJ

  • 1465
  • 1432
  • 1882 (三分搜)

Divide & Conquer, Binary Search

By hfy880916

Divide & Conquer, Binary Search

  • 274