>>>>> "VY" == Volkan YAZICI <[EMAIL PROTECTED]> writes:
[...]
    VY> Sizin algoritmanın Lisp/Scheme ile yazımına ya da kendisine
    VY> getireceğiniz öneriler nelerdir?

Setleri ne ile kodladiginiza bagli biraz da bu.  Mesela sayiyla 
yaparsaniz (hafizadan tasarruf):

(defun set-converter (num set) ;yavas! 
  (loop for i from 0 below (length set)
        for bits = num then (ash bits -1)
        when (oddp bits) collect (nth i set)))

deneyelim

CL-USER> (set-converter 3 '(1 2 3 4 5))
(1 2)
CL-USER> (set-converter 7 '(1 2 3 4 5))
(1 2 3)
CL-USER> (set-converter 8 '(1 2 3 4 5))
(4)
CL-USER> (set-converter 11 '(1 2 3 4 5))
(1 2 4)

O zaman butun kombinasyonlar icin sayi saymaniz kafi:

(defun combinations-num (set)
  (loop for i from 0 below (ash 1 (length set))
        collect i))

CL-USER> (let ((set '(1 2 3 4)))
           (dolist (encoded-subset (combinations-num set))
             (print (set-converter encoded-subset set))))

NIL 
(1) 
(2) 
(1 2) 
(3) 
(1 3) 
(2 3) 
(1 2 3) 
(4) 
(1 4) 
(2 4) 
(1 2 4) 
(3 4) 
(1 3 4) 
(2 3 4) 
(1 2 3 4) 
NIL
CL-USER> 

Tabii hizli olsun istiyorsaniz mesela soyle birsey de deneyebilirsiniz:

(defun make-set-converter (set)
  (let* ((set-size (length set))
         (set-array (make-array set-size :initial-contents set)))
    (compile nil
             `(lambda (num)
               (declare 
                (optimize (speed 3) (debug 0) (safety 0)))
               (loop for i fixnum from 0 below ,set-size
                     for bits of-type (unsigned-byte ,set-size) = num then (ash 
bits -1)
                     when (oddp bits) collect (svref ,set-array i))))))


CL-USER> (defvar set100 (loop for i from 1 to 100 collect i))
SET100
CL-USER> set100
(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 29
 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100)
CL-USER> (defvar hizli-conv)
HIZLI-CONV
CL-USER> (setf hizli-conv (make-set-converter set100))
;;temizlik
#<FUNCTION {B256BCD}>
CL-USER> (format t "~b~%" 31337357)
1110111100010101110001110
CL-USER> (set-converter 31337357 set100)
(1 3 4 8 9 10 12 14 18 19 20 21 23 24 25)
CL-USER> (funcall hizli-conv 31337357)
(1 3 4 8 9 10 12 14 18 19 20 21 23 24 25)
CL-USER> (time (dotimes (i 10000) (set-converter 31337357 set100)))
               
Evaluation took:
  0.043 seconds of real time
  0.044003 seconds of user run time
  0.0 seconds of system run time
  0 page faults and
  1,277,952 bytes consed.
NIL
CL-USER> (time (dotimes (i 10000) (funcall hizli-conv 31337357)))
               
Evaluation took:
  0.033 seconds of real time
  0.032002 seconds of user run time
  0.0 seconds of system run time
  0 page faults and
  1,277,952 bytes consed.
NIL

Boyle uzar gider.  (Cok ciddiye almayin hata yapmis olabilirim).  

BM


_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap