Update all new Tasks
This commit is contained in:
parent
00a190b0a6
commit
91df62d461
5697 changed files with 93386 additions and 804 deletions
68
Task/K-d-tree/Racket/k-d-tree-1.rkt
Normal file
68
Task/K-d-tree/Racket/k-d-tree-1.rkt
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#lang racket
|
||||
|
||||
; A tree consists of a point, a left and a right subtree.
|
||||
(struct tree (p l r) #:transparent)
|
||||
; If the node is in depth d, then the points in l has
|
||||
; the (d mod k)'th coordinate less than the same coordinate in p.
|
||||
|
||||
(define (kdtree d k ps)
|
||||
(cond [(empty? ps) #f] ; #f represents an empty subtree
|
||||
[else (define-values (p l r) (split-points ps (modulo d k)))
|
||||
(tree p (kdtree (+ d 1) k l) (kdtree (+ d 1) k r))]))
|
||||
|
||||
(define (split-points ps d)
|
||||
(define (ref p) (vector-ref p d))
|
||||
(define sorted-ps (sort ps < #:key ref))
|
||||
(define mid (quotient (+ (length ps)) 2))
|
||||
(define median (ref (list-ref sorted-ps mid)))
|
||||
(define-values (l r) (partition(λ(x)(< (ref x) median))sorted-ps))
|
||||
(values (first r) l (rest r)))
|
||||
|
||||
; The bounding box of a subtree:
|
||||
(struct bb (mins maxs) #:transparent)
|
||||
|
||||
(define (infinite-bb k)
|
||||
(bb (make-vector k -inf.0) (make-vector k +inf.0)))
|
||||
|
||||
(define/match (copy-bb h)
|
||||
[((bb mins maxs))
|
||||
(bb (vector-copy mins) (vector-copy maxs))])
|
||||
|
||||
(define (dist v w) (for/sum ([x v] [y w]) (sqr (- x y))))
|
||||
(define (intersects? g r hr) (<= (dist (closest-in-hr g hr) g) r))
|
||||
(define (closest-in-hr g hr)
|
||||
(for/vector ([gi g] [mini (bb-mins hr)] [maxi (bb-maxs hr)])
|
||||
(cond [(<= gi mini) mini]
|
||||
[(< mini gi maxi) gi]
|
||||
[else maxi])))
|
||||
|
||||
(define (split-bb hr d x)
|
||||
(define left (copy-bb hr))
|
||||
(define right (copy-bb hr))
|
||||
(vector-set! (bb-maxs left) d x)
|
||||
(vector-set! (bb-mins right) d x)
|
||||
(values left right))
|
||||
|
||||
(define visits 0) ; for statistics only
|
||||
(define (visit) (set! visits (+ visits 1)))
|
||||
(define (reset-visits) (set! visits 0))
|
||||
(define (regret-visit) (set! visits (- visits 1)))
|
||||
|
||||
(define (nearest-neighbor g t k)
|
||||
(define (nearer? p q) (< (dist p g) (dist q g)))
|
||||
(define (nearest p q) (if (nearer? p q) p q))
|
||||
(define (nn d t bb) (visit)
|
||||
(define (ref p) (vector-ref p (modulo d k)))
|
||||
(match t
|
||||
[#f (regret-visit) #(+inf.0 +inf.0 +inf.0)]
|
||||
[(tree p l r)
|
||||
(define-values (lbb rbb) (split-bb bb (modulo d k) (ref p)))
|
||||
(define-values (near near-bb far far-bb)
|
||||
(if (< (ref g) (ref p))
|
||||
(values l lbb r rbb)
|
||||
(values r rbb l lbb)))
|
||||
(define n (nearest p (nn (+ d 1) near near-bb)))
|
||||
(if (intersects? g (dist n g) far-bb)
|
||||
(nearest n (nn (+ d 1) far far-bb))
|
||||
n)]))
|
||||
(nn 0 t (infinite-bb k)))
|
||||
27
Task/K-d-tree/Racket/k-d-tree-2.rkt
Normal file
27
Task/K-d-tree/Racket/k-d-tree-2.rkt
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
(define (wikipedia-test)
|
||||
(define t (kdtree 0 2 '(#(2 3) #(5 4) #(9 6) #(4 7) #(8 1) #(7 2))))
|
||||
(reset-visits)
|
||||
(define n (nearest-neighbor #(9 2) t 2))
|
||||
(displayln "Wikipedia Test")
|
||||
(displayln (~a "Nearest neighbour to (9,2) is: " n))
|
||||
(displayln (~a "Distance: " (dist n #(9 2))))
|
||||
(displayln (~a "Visits: " visits "\n")))
|
||||
|
||||
(define (test k n)
|
||||
(define (random!) (for/vector ([_ k]) (random)))
|
||||
(define points (for/list ([_ n]) (random!)))
|
||||
(define t (kdtree 0 k points))
|
||||
(reset-visits)
|
||||
(define target (for/vector ([_ k]) 0.75))
|
||||
(define nb (nearest-neighbor target t k))
|
||||
(define nb-control (argmin (λ (p) (dist p target)) points))
|
||||
(displayln (~a n " points in R^3 test"))
|
||||
(displayln (~a "Nearest neighbour to " target " is: \n\t\t" nb))
|
||||
(displayln (~a "Control: \t" nb-control))
|
||||
(displayln (~a "Distance: \t" (dist nb target)))
|
||||
(displayln (~a "Control: \t" (dist nb-control target)))
|
||||
(displayln (~a "Visits: \t" visits)))
|
||||
|
||||
(wikipedia-test)
|
||||
(test 3 1000)
|
||||
(test 3 1000)
|
||||
20
Task/K-d-tree/Racket/k-d-tree-3.rkt
Normal file
20
Task/K-d-tree/Racket/k-d-tree-3.rkt
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
Wikipedia Test
|
||||
Nearest neighbour to (9,2) is: #(8 1)
|
||||
Distance: 2
|
||||
Visits: 3
|
||||
|
||||
1000 points in R^3 test
|
||||
Nearest neighbour to #(0.75 0.75 0.75) is:
|
||||
#(0.8092534479975508 0.7507095851813429 0.7706494651024903)
|
||||
Control: #(0.8092534479975508 0.7507095851813429 0.7706494651024903)
|
||||
Distance: 0.003937875019747008
|
||||
Control: 0.003937875019747008
|
||||
Visits: 83
|
||||
|
||||
1000 points in R^3 test
|
||||
Nearest neighbour to #(0.75 0.75 0.75) is:
|
||||
#(0.7775581478448806 0.7806612633582072 0.7396664367640902)
|
||||
Control: #(0.7775581478448806 0.7806612633582072 0.7396664367640902)
|
||||
Distance: 0.0018063471125121851
|
||||
Control: 0.0018063471125121851
|
||||
Visits: 39
|
||||
Loading…
Add table
Add a link
Reference in a new issue