Comment detail
魔方分割数 (Nested Flatten)
タグ付け忘れた. Gaucheです.
同じ計算を何回もしているので#1671を参考にメモ化しました.
n=5で2分と少々です. メモリ使用量は11MB (多分).
Pen4 3GHzです.
gosh> ;(time (maho-memo 4))
; real 0.078
; user 0.078
; sys 0.000
392
gosh> ;(time (maho-memo 5))
; real 130.656
; user 124.562
; sys 4.828
3245664
n=5で2分と少々です. メモリ使用量は11MB (多分).
Pen4 3GHzです.
gosh> ;(time (maho-memo 4))
; real 0.078
; user 0.078
; sys 0.000
392
gosh> ;(time (maho-memo 5))
; real 130.656
; user 124.562
; sys 4.828
3245664
see: どう書く?org #1671 shiro: メモ化をちょっと試してみた。 単純にn...(「組合せ型の最小完全ハッシュ関数」の逆関数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (define (maho-memo n)
(define cn (/ (* n (+ (* n n) 1)) 2))
(define maho-in-memo
(let1
tab (make-hash-table 'equal?)
(define (memo m l v) (hash-table-put! tab (cons m l) v) v)
(lambda (m l)
(cond ((= m 0) 1)
((hash-table-get tab (cons m l) #f))
(else
(memo m l
(apply
+
(map
(lambda (a) (maho-in-memo (- m n) (lset-difference equal? l a)))
(map
(lambda (li) (cons (car l) li))
(filter
(lambda (li) (= (apply + li) (- cn (car l))))
(combinations (cdr l) (- n 1))))))))))))
(maho-in-memo (* n n) (iota (* n n) 1)))
|
二重投稿orz 申し訳ないんですが, #4828の方を消してもらえませんでしょうか?
無駄な計算を省いて1分切ったので再投稿
gosh>
;(time (maho-memo 5))
; real 43.391
; user 42.625
; sys 0.641
3245664
gosh>
;(time (maho-memo 5))
; real 43.391
; user 42.625
; sys 0.641
3245664
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | (use srfi-1)
(use util.combinations)
(define (maho-memo n)
;tableに足してcnになるリストを入れておく
(define table
(let ((cn (/ (* n (+ (* n n) 1)) 2)))
(filter
(lambda (li) (= (apply + li) cn))
(combinations (iota (* n n) 1) n))))
(define maho-in-memo
(let1
tab (make-hash-table 'equal?)
(define (memo m l v) (hash-table-put! tab (cons m l) v) v)
(lambda (m l)
(cond ((= m 0) 1)
((hash-table-get tab (cons m l) #f))
(else
(memo m l
(apply
+
(map ; 今のlからaを除いたリストでmaho-in-memoを呼ぶ
(lambda (a) (maho-in-memo (- m n) (lset-difference equal? l a)))
(filter ;(car l)で始まるtableの中のリストを抜き出す
(lambda (li) (and (equal? (car li) (car l)) (lset<= equal? li l)))
table)))))))))
(maho-in-memo (* n n) (iota (* n n) 1)))
(time (maho-memo 5))
|



186 #4824() [ Scheme ] Rating1/1=1.00
;Pen4 3GHzで
;(time (maho 4)) => 392
;real 0.109/user 0.109/sys 0.000
;(time (maho 5)) => 3245664
;real 1528.250/user 1423.391/sys 104.187
;(time (maho-by-enm 4)) => 392
;real 254.094/user 249.000/sys 1.531
maho-by-enmは#4819や#4821と同じ方法です
Rating1/1=1.00-0+
2 replies [ reply ]