diff options
Diffstat (limited to 'src/weighted-quick-union.lisp')
| -rw-r--r-- | src/weighted-quick-union.lisp | 34 |
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))) |
