summaryrefslogtreecommitdiff
path: root/coding-exercises
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises')
-rw-r--r--coding-exercises/2/59.rkt1
-rw-r--r--coding-exercises/2/60.rkt2
-rw-r--r--coding-exercises/2/61.rkt14
-rw-r--r--coding-exercises/2/62.rkt15
-rw-r--r--coding-exercises/2/63.rkt102
-rw-r--r--coding-exercises/2/64.rkt20
6 files changed, 152 insertions, 2 deletions
diff --git a/coding-exercises/2/59.rkt b/coding-exercises/2/59.rkt
index 2b10a66..e5f3289 100644
--- a/coding-exercises/2/59.rkt
+++ b/coding-exercises/2/59.rkt
@@ -24,6 +24,5 @@
((not (element-of-set? (car set1) set2))
(cons (car set1)
(union-set (cdr set1) set2)))
-
(else (union-set (cdr set1) set2))))
(union-set (list 1 2 3) (list 2 3 'c))
diff --git a/coding-exercises/2/60.rkt b/coding-exercises/2/60.rkt
index 87eb7be..3effe1c 100644
--- a/coding-exercises/2/60.rkt
+++ b/coding-exercises/2/60.rkt
@@ -18,7 +18,7 @@
(define (intersection-set set1 set2)
(define (iter s1 s2 result)
(cond ((or (null? s1) (null? s2)) result)
- ((and
+ ((and
(not (element-of-set? (car s1) result))
(element-of-set? (car s1) s2))
(iter (cdr s1) s2 (cons (car s1) result)))
diff --git a/coding-exercises/2/61.rkt b/coding-exercises/2/61.rkt
new file mode 100644
index 0000000..71d773d
--- /dev/null
+++ b/coding-exercises/2/61.rkt
@@ -0,0 +1,14 @@
+#lang racket
+
+;; linear scan required for this one, but on average we save some time because sometimes we can quickly
+;; adjoin small values and other times a full linear scan is required to add a high value.
+(define (adjoin-set x myset)
+ (cond ((null? myset) (cons x '()))
+ ((= (car myset) x) myset)
+ ((> (car myset) x) (cons x myset))
+ (else (cons (car myset)
+ (adjoin-set x (cdr myset))))))
+
+(define test-set (list 1 2 3 4 5 7))
+(adjoin-set 6 test-set)
+(adjoin-set 8 test-set)
diff --git a/coding-exercises/2/62.rkt b/coding-exercises/2/62.rkt
new file mode 100644
index 0000000..705dcbd
--- /dev/null
+++ b/coding-exercises/2/62.rkt
@@ -0,0 +1,15 @@
+#lang racket
+
+;; In each branch of the problem we either terminate the process or we reduce the problem to a subproblem with set - (car set)
+(define (union-set set1 set2)
+ (cond ((and (null? set1) (null? set2)) '())
+ ((null? set1) (cons (car set2) (union-set set1 (cdr set2))))
+ ((null? set2) (cons (car set1) (union-set (cdr set1) set2)))
+ ((= (car set1) (car set2)) (cons (car set2) (union-set (cdr set1) (cdr set2))))
+ ((> (car set1) (car set2)) (cons (car set2) (union-set set1 (cdr set2))))
+ ((< (car set1) (car set2)) (cons (car set1) (union-set (cdr set1) set2)))))
+
+(define test-list (list 1 2))
+(define test-list2 (list 4 5 6 7))
+(union-set test-list test-list2)
+
diff --git a/coding-exercises/2/63.rkt b/coding-exercises/2/63.rkt
new file mode 100644
index 0000000..6a8fd88
--- /dev/null
+++ b/coding-exercises/2/63.rkt
@@ -0,0 +1,102 @@
+#lang racket
+
+(define (entry tree) (car tree))
+(define (left-branch tree) (cadr tree))
+(define (right-branch tree) (caddr tree))
+(define (make-entry entry left right)
+ (list entry left right))
+
+(define (element-of-set? x mset)
+ (cond ((null? mset) false)
+ ((= x (entry mset)) true)
+ ((> x (entry mset))
+ (element-of-set? (right-branch mset)))
+ ((< x (entry mset))
+ (element-of-set? (left-branch mset)))))
+
+(define (adjoin-set x mset)
+ (cond ((null? mset) (make-tree x '() '()))
+ ((= x (entry mset)) mset)
+ ((< x (entry mset))
+ (make-tree
+ (entry mset)
+ (adjoin-set x (left-branch mset))
+ (right-branch mset)))
+ ((> x (entry))
+ (make-tree
+ (entry mset)
+ (left-branch mset)
+ (adjoin-set x (right-branch mset))))))
+
+(define (tree->list-1 tree)
+ (if (null? tree)
+ '()
+ (append (tree->list-1 (left-branch tree))
+ (cons (entry tree)
+ (tree->list-1 (right-branch tree))))))
+
+(define (tree->list-2 tree)
+ (define (copy-to-list tree result-list)
+ (if (null? tree)
+ result-list
+ (copy-to-list (left-branch tree)
+ (cons (entry tree)
+ (copy-to-list (right-branch tree)
+ result-list)))))
+ (copy-to-list tree '()))
+
+
+;; depth of a balanced tree with n elements is log n.. right? Because every level you need 2*(level-1) elements, so the total levels is how many time we can do that step until 2*levels > n.
+;; So it is the log a where a is the smallest number that only has factor 2 and > n.
+;; Both procedure 1 and 2 are levelwise reducing the problem.
+;; Only the overhead spent at each level is greater for 1, because append is used in the linear recursive process.
+;; Since at every level we do a linear scan of all left elements, it is n*logn.
+;; 1 is a linear iterative procedure and has almost no overhead at every level except a cons operation so it is logn.
+((lambda ()
+ (define test216a (make-entry
+ 7
+ (make-entry
+ 3
+ (make-entry
+ 1 '() '())
+ (make-entry 5 '() '()))
+
+ (make-entry
+ 9
+ '()
+ (make-entry
+ 11
+ '()
+ '()))))
+ (println (tree->list-1 test216a))
+ (println (tree->list-2 test216a))
+ (newline)
+ (define test216b (make-entry
+ 3
+ (make-entry 1 '() '())
+ (make-entry
+ 7
+ (make-entry 5 '() '())
+ (make-entry
+ 9
+ '()
+ (make-entry
+ 11
+ '()
+ '())))))
+ (println (tree->list-1 test216b))
+ (println (tree->list-2 test216b))
+ (newline)
+ (define test216c (make-entry
+ 5
+ (make-entry 3 (make-entry 1 '() '()) '())
+ (make-entry
+ 9
+ (make-entry 7 '() '())
+ (make-entry
+ 11
+ '()
+ '()))))
+ (println (tree->list-1 test216c))
+ (println (tree->list-2 test216c))
+ (newline)))
diff --git a/coding-exercises/2/64.rkt b/coding-exercises/2/64.rkt
new file mode 100644
index 0000000..90994e8
--- /dev/null
+++ b/coding-exercises/2/64.rkt
@@ -0,0 +1,20 @@
+#lang racket
+(define (list->tree elements)
+ (car (partial-tree elements (length elements))))
+
+(define (partial-tree elts n)
+ (if (= n 0)
+ (let ((left-size (quotient (- n 1)
+ 2)))
+ (let ((left-result (partial-tree elts left-size)))
+ (let ((left-tree (car left-result))
+ (non-left-elts (cdr left-result))
+ (right-size (- n (+ left-size 1))))
+
+ (let ((this-entry (car non-left-elts))
+ (right-result (partial-tree (cdr non-left-elts)
+ right-size)))
+ (let ((right-tree (car right-result))
+ (remaining-elts (cdr right-result)))
+ (cons (make-tree thientry left-tree right-tree)
+ remaining-elts))))))))