From 0b0e20baf82563de4e2b3735baeafbc7c14d6b15 Mon Sep 17 00:00:00 2001 From: Giovanni Di Grezia Date: Sun, 18 May 2014 16:47:04 +0200 Subject: [PATCH] Ordered List e BinarySearchTree --- com/xgiovio/OrderedListSetTest.java | 51 ++++++++ dictionary/BinarySearchTree.java | 180 ++++++++++++++++++++++++++++ set/OrderedListSet.java | 53 +++++--- utility/merge/MergeTemplate.java | 46 +++++-- 4 files changed, 300 insertions(+), 30 deletions(-) create mode 100644 com/xgiovio/OrderedListSetTest.java create mode 100644 dictionary/BinarySearchTree.java diff --git a/com/xgiovio/OrderedListSetTest.java b/com/xgiovio/OrderedListSetTest.java new file mode 100644 index 0000000..ab17e4e --- /dev/null +++ b/com/xgiovio/OrderedListSetTest.java @@ -0,0 +1,51 @@ +package com.xgiovio; + +import position.NodePositionList; +import set.OrderedListSet; + +import java.security.InvalidKeyException; + +/** + * Created with MONSTER. + * User: xgiovio + * Date: 18/05/2014 + * Time: 15:58 + */ +public class OrderedListSetTest { + + public static void main(String[] args) { + + NodePositionList t = new NodePositionList(); + t.addLast("1"); + t.addLast("2"); + t.addLast("5"); + t.addLast("6"); + t.addLast("8"); + OrderedListSet a = new OrderedListSet(t); + System.out.println(a); + + + NodePositionList t2 = new NodePositionList(); + t2.addLast("3"); + t2.addLast("4"); + t2.addLast("5"); + t2.addLast("7"); + t2.addLast("8"); + t2.addLast("9"); + t2.addLast("12"); + OrderedListSet a2 = new OrderedListSet(t2); + System.out.println(a2); + + a.subtract(a2); + System.out.println(a); + + + + + + + + + + } +} diff --git a/dictionary/BinarySearchTree.java b/dictionary/BinarySearchTree.java new file mode 100644 index 0000000..727e15c --- /dev/null +++ b/dictionary/BinarySearchTree.java @@ -0,0 +1,180 @@ +package dictionary; +import exceptions.InvalidEntryException; +import position.NodePositionList; +import position.Position; +import position.PositionList; +import priorityqueue.Entry; +import tree.binarytree.BTPosition; +import tree.binarytree.LinkedBinaryTree; +import utility.DefaultComparator; + +import java.security.InvalidKeyException; +import java.util.Comparator; + + + + +public class BinarySearchTree extends LinkedBinaryTree> implements Dictionary { + + protected Comparator C; // comparator + protected Position> actionPos; // insert node or removed node's parent + protected int numEntries = 0; // number of entries + + public BinarySearchTree() { + C = new DefaultComparator(); + addRoot(null); + } + + public BinarySearchTree(Comparator c) { + C = c; + addRoot(null); + } + + /** Nested class for location-aware binary search tree entries */ + protected static class BSTEntry implements Entry { + protected K key; + protected V value; + protected Position> pos; + BSTEntry(K k, V v, Position> p) { + key = k; value = v; pos = p; + } + public K getKey() { return key; } + public V getValue() { return value; } + public Position> position() { return pos; } + } + + /** Extracts the key of the entry at a given node of the tree. */ + protected K key(Position> position) { + return position.element().getKey(); + } + + /** Extracts the value of the entry at a given node of the tree. */ + protected V value(Position> position) { + return position.element().getValue(); + } + + /** Extracts the entry at a given node of the tree. */ + protected Entry entry(Position> position) { + return position.element(); + } + + /** Replaces an entry with a new entry (and reset the entry's location) */ + protected void replaceEntry(Position > pos, Entry ent) { + ((BSTEntry) ent).pos = pos; + replace(pos, ent); + } + + +protected void checkKey(K key) throws InvalidKeyException { + if(key == null) + throw new InvalidKeyException("null key"); +} + +protected void checkEntry(Entry ent) throws InvalidEntryException { + if(ent == null || !(ent instanceof BSTEntry)) + throw new InvalidEntryException("invalid entry"); +} + +protected Entry insertAtExternal(Position> v, Entry e) { + expandExternal(v,null,null); + replace(v, e); + numEntries++; + return e; +} +/** Auxiliary method for removing an external node and its parent */ +protected void removeExternal(Position> v) { + removeAboveExternal(v); + numEntries--; +} +/** Auxiliary method used by find, insert, and remove. */ +protected Position> treeSearch(K key, Position> pos) { + if (isExternal(pos)) return pos; // key not found; return external node + else { + K curKey = key(pos); + int comp = C.compare(key, curKey); + if (comp < 0) + return treeSearch(key, left(pos)); // search left subtree + else if (comp > 0) + return treeSearch(key, right(pos)); // search right subtree + return pos; // return internal node where key is found + } +} + + +// Adds to L all entries in the subtree rooted at v having keys equal to k +protected void addAll(PositionList> L, Position> v, K k) { + if (isExternal(v)) return; + Position> pos = treeSearch(k, v); + if (!isExternal(pos)) { // we found an entry with key equal to k + addAll(L, left(pos), k); + L.addLast(pos.element()); // add entries in inorder + addAll(L, right(pos), k); + } // this recursive algorithm is simple, but it's not the fastest +} + + /** Returns the number of entries in the tree. */ + public int size() { return numEntries; } + + /** Returns whether the tree is empty. */ + public boolean isEmpty() { return size() == 0; } + + /** Returns an entry containing the given key. Returns null if no such entry exists. */ + public Entry find(K key) throws InvalidKeyException { + checkKey(key); // may throw an InvalidKeyException + Position> curPos = treeSearch(key, root()); + actionPos = curPos; // node where the search ended + if (isInternal(curPos)) return entry(curPos); + return null; + } + + /** Returns an iterable collection of all the entries containing the given key. */ + public Iterable> findAll(K key) throws InvalidKeyException { + checkKey(key); // may throw an InvalidKeyException + PositionList> L = new NodePositionList>(); + addAll(L, root(), key); + return L; + } + + /** Inserts an entry into the tree and returns the newly created entry. */ + public Entry insert(K k, V x) throws InvalidKeyException { + checkKey(k); // may throw an InvalidKeyException + Position> insPos = treeSearch(k, root()); + while (!isExternal(insPos)) // iterative search for insertion position + insPos = treeSearch(k, left(insPos)); + actionPos = insPos; // node where the new entry is being inserted + return insertAtExternal(insPos, new BSTEntry(k, x, insPos)); + } + + /** Removes and returns a given entry. */ + public Entry remove(Entry ent) throws InvalidEntryException { + checkEntry(ent); // may throw an InvalidEntryException + Position> remPos = ((BSTEntry) ent).position(); + Entry toReturn = entry(remPos); // entry to be returned + if (isExternal(left(remPos))) remPos = left(remPos); // left easy case + else if (isExternal(right(remPos))) remPos = right(remPos); // right easy case + else { // entry is at a node with internal children + Position> swapPos = remPos; // find node for moving entry + remPos = right(swapPos); + do + remPos = left(remPos); + while (isInternal(remPos)); + replaceEntry(swapPos, (Entry) parent(remPos).element()); + } + actionPos = sibling(remPos); // sibling of the leaf to be removed + removeExternal(remPos); + return toReturn; + } + + /** Returns an iterator containing all entries in the tree. */ + public Iterable> entries() { + PositionList> entries = new NodePositionList>(); + Iterable>> positer = positions(); + for (Position> cur: positer) + if (isInternal(cur)) + entries.addLast(cur.element()); + return entries; + } + + +} + diff --git a/set/OrderedListSet.java b/set/OrderedListSet.java index e20f1a3..9db9606 100644 --- a/set/OrderedListSet.java +++ b/set/OrderedListSet.java @@ -20,16 +20,26 @@ public class OrderedListSet implements Set { - OrderedListSet() { + public OrderedListSet() { L = new NodePositionList(); - c = new DefaultComparator(); + c = new DefaultComparator(); } - OrderedListSet(Comparator in_c) { + public OrderedListSet(Comparator in_c) { L = new NodePositionList(); c = in_c; } + public OrderedListSet(PositionList in_l){ + L = in_l; + c = new DefaultComparator(); + } + + public OrderedListSet(PositionList in_l,Comparator in_c ){ + L = in_l; + c = in_c; + } + @@ -47,50 +57,59 @@ public class OrderedListSet implements Set { @Override - public Set union(Set B) {return null; + public Set union(Set B) { + MergeUnion ret = new MergeUnion(L, ((OrderedListSet)B).L , c ); + L = ret.getResult(); + return this; + } @Override public Set intersect(Set B) { - return null; + MergeIntersect ret = new MergeIntersect(L, ((OrderedListSet)B).L , c ); + L = ret.getResult(); + return this; } @Override public Set subtract(Set B) { - return null; + MergeSubtract ret = new MergeSubtract(L, ((OrderedListSet)B).L , c ); + L = ret.getResult(); + return this; } - - - + @Override + public String toString() { + return L.toString(); + } //////////////////////// inner class override methods from merge template ///// protected class MergeUnion extends MergeTemplate{ - public MergeUnion (PositionList A , PositionList B, DefaultComparator c){ + public MergeUnion (PositionList A , PositionList B, Comparator c){ super(A,B,c); } @Override protected void aIsLess(E a) { - + s.addLast(a); } @Override protected void bIsLess(E b) { - + s.addLast(b); } @Override protected void bothAreEqual(E a, E b) { - + s.addLast(a); } } protected class MergeIntersect extends MergeTemplate{ - public MergeIntersect (PositionList A , PositionList B, DefaultComparator c){ + public MergeIntersect (PositionList A , PositionList B, Comparator c){ super(A,B,c); } @@ -106,19 +125,19 @@ public class OrderedListSet implements Set { @Override protected void bothAreEqual(E a, E b) { - + s.addLast(a); } } protected class MergeSubtract extends MergeTemplate{ - public MergeSubtract (PositionList A , PositionList B, DefaultComparator c){ + public MergeSubtract (PositionList A , PositionList B, Comparator c){ super(A,B,c); } @Override protected void aIsLess(E a) { - + s.addLast(a); } @Override diff --git a/utility/merge/MergeTemplate.java b/utility/merge/MergeTemplate.java index 64f298a..654ac5c 100644 --- a/utility/merge/MergeTemplate.java +++ b/utility/merge/MergeTemplate.java @@ -19,8 +19,8 @@ import java.util.Iterator; */ public abstract class MergeTemplate { - PositionList s = new NodePositionList(); - Comparator c = null; + protected PositionList s = new NodePositionList(); + protected Comparator c = null; public MergeTemplate (PositionList A, PositionList B){ this(A,B,new DefaultComparator()); @@ -29,29 +29,49 @@ public abstract class MergeTemplate { public MergeTemplate (PositionList A, PositionList B, Comparator in_c){ c = in_c; - E a,b; + E a = null ,b = null; Iterator Ait, Bit; Ait = A.iterator(); Bit = B.iterator(); - while (!(Ait.hasNext()) && !(Bit.hasNext())) { + if ( Ait.hasNext() && Bit.hasNext() ){ a = Ait.next(); - b= Bit.next(); + b = Bit.next(); + for (; true; ) { - if ( c.compare(a,b) < 0 ) - aIsLess(a); - else if (c.compare(a,b) > 0) - bIsLess(b); - else // se b = a - bothAreEqual(a, b); + if (c.compare(a, b) < 0) { + aIsLess(a); + if (Ait.hasNext()) + a = Ait.next(); + else + break; + } else { + if (c.compare(a, b) > 0) { + bIsLess(b); + if (Bit.hasNext()) + b = Bit.next(); + else + break; + } else {// se b = a + bothAreEqual(a, b); + if (Ait.hasNext() && Bit.hasNext()) { + a = Ait.next(); + b = Bit.next(); + } else + break; + + } + } + + } } - while (!(Ait.hasNext())) { + while ( Ait.hasNext() ) { a = Ait.next(); aIsLess(a); } - while (!(Bit.hasNext())) { + while ( Bit.hasNext()) { b = Bit.next(); bIsLess(b); }