Schnittstelle |
für Verzeichnisse in Java: interface Map
|
|
package ds.interfaces;
import java.util.Iterator;
import ds.util.Invariant;
import ds.util.Function2;
import ds.util.K;
import ds.util.V;
import ds.util.KV;
public
interface Map
extends Iterable<KV>,
Invariant {
boolean isEmpty();
boolean member(K k);
V lookup(K k);
int size();
KV findMin();
KV findMax();
Map insert(K k, V v);
Map remove(K k);
Map union(Map m2);
Map difference(Map m2);
Map unionWith(Function2<V,V,V> op, Map m2);
Map differenceWith(Function2<V,V,V> op, Map m2);
Map copy();
}
|
Hilfsklassen
|
für die Schlüssel und Werte
|
K |
package ds.util;
public
class K implements Comparable<K> {
public final int key;
public K(int k) {
key = k;
}
public static K mkK(int v) {
return
new K(v);
}
public int intValue() {
return
key;
}
public int compareTo(K k2) {
if (key == k2.key)
return 0;
if (key > k2.key)
return 1;
else
return -1;
}
public boolean equalTo(K k2) {
return
compareTo(k2) == 0;
}
public String toString() {
return "" + key;
}
public int hash() {
return
key;
}
}
|
V |
package ds.util;
public
class V {
public final int value;
private V(int v) {
value = v;
}
public static V mkV(int v) {
return
new V(v);
}
public String toString() {
return "" + value;
}
}
|
KV |
package ds.util;
import ds.util.K;
import ds.util.V;
public final
class KV {
public final K fst;
public final V snd;
private KV(K k, V v) {
fst = k;
snd = v;
}
public String toString() {
return
"(" + fst.toString() +
", " + snd.toString() +
")";
}
public static KV mkPair(K k, V v) {
return
new KV(k, v);
}
}
|
| |
Binärer Suchbaum
|
Erweiterung von einfach verketteten sortierten Listen
|
Ziele |
|
1.
|
Suche effizienter als bei (sortierten) Listen
|
|
in O(log n)
|
2.
|
Einfügen effizienter als bei Listen
|
|
in O(log n)
|
3.
|
Mengenoperationen Vereinigung, Durchschnitt, Differenz, ...,
|
|
mindestens so effizient wie bei sortierten Listen
|
|
mindestens in O(n1 + n2)
|
|
schlecht: O(n1 * log n2)
|
| |
Idee |
|
1.
|
binäre anstatt lineare Suche
|
2. |
dadurch möglichst bei jedem Vergleich eine Halbierung des Suchraums erreichen
|
3. |
Datenstruktur aus verketteter Liste wird um eine zweite Liste erweitert
|
| |
Klassenstruktur
|
public abstract
class BinaryTree
implements Map {
...
private static final
class Empty
extends BinaryTree {
...
}
private static final
class Node
extends BinaryTree {
final K k;
final V v;
final BinaryTree l;
final BinaryTree r;
...
}
}
|
Konstruktor-Funktionen
|
public static BinaryTree empty() {
return
EMPTY;
}
public static BinaryTree singleton(K k, V v) {
return
new Node(k, v, EMPTY, EMPTY);
}
|
?
|
Wird eine Invariante zur Beschreibung der Konsistenz der Datenstruktur benötigt?
|
| |
Implementierung
|
wird in der Vorlesung entwickelt
|