数列で学ぶ初めての CommonLisp #fibonacci

1,049 views

Published on

プログラマーズナイト #3 にて LT したもの(未完成版)の完成版

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,049
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

数列で学ぶ初めての CommonLisp #fibonacci

  1. 1. 00. First数列で学ぶ初めての CommonLisp # fibonacci 2012-04-28
  2. 2. 01. Profile Akiko Terada (@pgf2)Work : software developer
  3. 3. 02. fibonacci -55 34 -21 13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13 21 34 55F(0) = 0F(1) = 1F(n) = F(n-2)+F(n-1) (n >= 2)F(-n) = (-1)^{n+1}*F(n)
  4. 4. 03. Divide and conquer algorithm 先ずは直感 分割統治法!!
  5. 5. 03. Divide and conquer algorithm分割統治法は、そのままでは解決できない問題を小さな問題に分割することで、最終的に問題を解決しようとする考え方。また、その方法やアルゴリズム。 分割統治法 - Wikipedia
  6. 6. 03. Divide and conquer algorithm(defun fib(n) (cond ((< n 1) 0) ((= n 1) 1) (t (+ (f (- n 2)) (f (- n 1))))))
  7. 7. 03. Divide and conquer algorithmF(2) = F(1) + F(0)F(3) = F(2) + F(1) = F(1) + F(0) + F(1)F(4) = F(3) + F(2) = F(2) + F(1) + F(1) + F(0) = F(1) + F(0) + F(1) + F(1) + F(0) 計算コストが指数的に拡散してしまう!
  8. 8. 04. Dynamic Programmingトップダウンが駄目ならボトムアップ 動的計画法!!
  9. 9. 04. Dynamic Programming動的計画法は、コンピュータ科学の分野において、ある最適化問題を複数の部分問題に分割して解く際に、そこまでに求められている以上の最適解が求められないような部分問題を切り捨てながら解いていく手法である。 動的計画法 - Wikipedia
  10. 10. 04. Dynamic Programming(defun fib(n) (let ((n0 0) (n1 1) (i 1) (tmp)) (loop (if (> i n) (return n0)) (setq tmp (+ n0 n1)) (setq n0 n1) (setq n1 tmp) (incf i))))
  11. 11. 05. Memoization 他には? メモ化!!
  12. 12. 05. Memoizationメモ化とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチンの呼び出し毎の再計算を防ぐ手法である。 メモ化 - Wikipedia
  13. 13. 05. Memoization(setf (symbol-function fib) (let ((table (make-hash-table :test #equal))) (labels ((f (n) (let ((val (gethash n table nil))) (unless val (setf val (cond ((< n 0) 0) ((= n 1) 1) (t (+ (f (- n 2)) (f (- n 1)))))) (setf (gethash n table) val)) val))) #f)))
  14. 14. 05. Memoization計算コストと領域コストの問題発生 難しいのでパス :-)
  15. 15. 06. Conclusion● 分割統治法 → 計算コスト● 動的計画法 → ?● メモ化 → 領域コスト コスト考えるなら動的計画法!
  16. 16. 07. Lastご清聴ありがとうございました!

×