aboutsummaryrefslogtreecommitdiff
path: root/src/weighted-quick-union.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/weighted-quick-union.lisp')
-rw-r--r--src/weighted-quick-union.lisp34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/weighted-quick-union.lisp b/src/weighted-quick-union.lisp
index 16b1aa5..7a3a3a7 100644
--- a/src/weighted-quick-union.lisp
+++ b/src/weighted-quick-union.lisp
@@ -1,27 +1,28 @@
-;; Create network nodes: A two dimensionnal array.
-;; 1st dimension = the network
-;; 2nd dimension = each subtree node quantities
+;;;; Weighted Quick Union Algorithm
+;;;; This algorithm solve dynamic connectivity
+;;;; problem by providing a way to find if there
+;;;; is a path between two nodes in a dynamic graph.
+;;;; It is an improved version of the Quick Union algorithm
+;;;; by improving the way that the union-tree is constructed
+;;;; The algorithm try to reduce the deepness of the tree in
+;;;; order to optimize the find-root function
+
+;;; Base functions
+
(defun create-network (n)
- "Build a quick-find network using a multi-dimensional dynamic vector"
+ "Build a quick-find network using a multi-dimensional dynamic vector:\n
+1st dimension = the network\n 2nd dimension = each subtree node quantities"
(let ((network (make-array `(2 ,n) :initial-element 1)))
(dotimes (id n)
(setf (aref network 0 id) id))
network))
-;; Find the root of a node
(defun find-root (network node)
"Find the root of a sub-tree in the network."
(do ((id node value)
(value (aref network 0 node) (aref network 0 value)))
((= id value) id)))
-;; Check if two nodes are connected
-(defmacro connected (network n1 n2)
- "Return true if n1 and n2 are connected and nil otherwise. connection represent
-the find operation on the Quick Union algorithm"
- `(= (find-root ,network ,n1) (find-root ,network ,n2)))
-
-;; Link two nodes together
(defun union_ (network n1 n2)
"Connect to sub-tree together. union represent the union operation on the Quick Union algorithm"
(let ((new-network (copy-tree network))) ; Duplicate network
@@ -39,9 +40,16 @@ the find operation on the Quick Union algorithm"
new-network)))
+;;; Macro definitions
+
+
+(defmacro connected (network n1 n2)
+ "Return true if n1 and n2 are connected and nil otherwise. connection represent
+the find operation on the Quick Union algorithm"
+ `(= (find-root ,network ,n1) (find-root ,network ,n2)))
-;; A consed version of union_
(defmacro nunion_ (network n1 n2)
+ "A consed version of the union function."
`(setf ,network (union_ ,network ,n1 ,n2)))