Processing math: 100%

3.Comparison (1)§

Comparison (2)

KVpair

This is a truly general way to solve the problem.

// KVPair class definition
public class KVPair implements Comparable {
  Comparable theKey;
  Object theVal;

  KVPair(Comparable k, Object v) {
    theKey = k;
    theVal = v;
  }

  public int compareTo(Object it) throws ClassCastException {
    if (it instanceof KVPair) // Compare two KVPair objects
      return theKey.compareTo(((KVPair)it).key());
    else if (it instanceof Comparable) // Compare against a key value
      return theKey.compareTo(it);
    else
      throw new ClassCastException("Something comparable is expected.");
  }

  public Comparable key() {
    return theKey;
  }

  public Object value() {
    return theVal;
  }
}

.

.

KVpair: Generics

// KVPair class definition
public class KVPair<K extends Comparable<K>, E>
               implements Comparable<KVPair<K,E>> {
  K theKey;
  E theVal;

  KVPair(K k, E v) {
    theKey = k;
    theVal = v;
  }

  // Compare KVPairs
  public int compareTo(KVPair<K,E> it) {
    return theKey.compareTo(it.key());
  }

  // Compare against a key
  public int compareTo(K it) {
    return theKey.compareTo(it);
  }

  public K key() {
    return theKey;
  }

  public E value() {
    return theVal;
  }


  public String toString() {
    return theKey.toString() + ", " + theVal.toString();
  }
}

.

.

Using the KVpair (1)

static <T extends Comparable<T>> void inssort(T[] A) {
  for (int i=1; i<A.length; i++) // Insert i'th record
    for (int j=i; (j>0) && (A[j].compareTo(A[j-1]) < 0); j--)
      swap(A, j, j-1);
}

What is being compared?

What if we want to find the record that has a given key?

Binary Tree Implementation (1)

"Simple" node model.

Binary tree node implementation

Binary Tree Implementation (2)

Internal nodes can be different from leaf nodes.

Expression Tree

Inheritance (1)

// Base class for expression tree nodes
interface VarBinNode {
  boolean isLeaf(); // All subclasses must implement
}

/** Leaf node */
class VarLeafNode implements VarBinNode {
  private String operand;                 // Operand value

  VarLeafNode(String val) { operand = val; }
  boolean isLeaf() { return true; }
  String value() { return operand; }
}

Inheritance (2)

/** Internal node */
class VarIntlNode implements VarBinNode {
  private VarBinNode left;                // Left child
  private VarBinNode right;               // Right child
  private Character operator;             // Operator value

  VarIntlNode(Character op, VarBinNode l, VarBinNode r)
    { operator = op; left = l; right = r; }
  boolean isLeaf() { return false; }
  VarBinNode leftchild() { return left; }
  VarBinNode rightchild() { return right; }
  Character value() { return operator; }
}

Inheritance (3)

1 / 44 Settings
<<<>>>

Preorder traversal begins on pointer-based binary tree.

Created with Raphaël 2.1.2
  • public static void traverse(VarBinNode rt) {
  • if (rt == null) { return; } // Nothing to visit
  • if (rt.isLeaf()) { // Process leaf node
  • Visit.VisitLeafNode(((VarLeafNode)rt).value());
  • }
  • else { // Process internal node
  • Visit.VisitInternalNode(((VarIntlNode)rt).value());
  • traverse(((VarIntlNode)rt).leftchild());
  • traverse(((VarIntlNode)rt).rightchild());
  • }
  • }
Created with Raphaël 2.1.2
-
*
c
*
+
4
x
a
*
2
x
rt
Proficient Saving... Error Saving
Server Error
Resubmit

Design Patterns

Composite (1)

   /** Base class: Composite */
   interface VarBinNode {
     boolean isLeaf();
     void traverse();
   }

   /** Leaf node: Composite */
   class VarLeafNode implements VarBinNode {
     private String operand;                 // Operand value

     VarLeafNode(String val) { operand = val; }
     boolean isLeaf() { return true; }
     String value() { return operand; }

     void traverse() {
       Visit.VisitLeafNode(operand);
     }
   }

Composite (2)

   /** Internal node: Composite */
   class VarIntlNode implements VarBinNode { // Internal node
     private VarBinNode left;                // Left child
     private VarBinNode right;               // Right child
     private Character operator;             // Operator value

     VarIntlNode(Character op,
                        VarBinNode l, VarBinNode r)
       { operator = op; left = l; right = r; }
     boolean isLeaf() { return false; }
     VarBinNode leftchild() { return left; }
     VarBinNode rightchild() { return right; }
     Character value() { return operator; }

     void traverse() {
       Visit.VisitInternalNode(operator);
       if (left != null) left.traverse();
       if (right != null) right.traverse();
     }
   }

Composite (3)

   /** Preorder traversal */
   static void traverse(VarBinNode rt) {
     if (rt != null) rt.traverse();
   }

Space Overhead (1)

Space Overhead (2)

Eliminate pointers from the leaf nodes

n/2(2p)n/2(2p)+dn=pp+d

This is 1/2 if p=d.

(2p)/(2p+d) if data only at leaves 2/3 overhead.

Note that some method is needed to distinguish leaves from internal nodes.