Elementary Data Structures 3 Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 29 september 2014 ODE/FHTBM Elementary Data Structures 3 29 september 2014 1/14
Meer elementaire datastrukturen Symbol tables Binary Trees ODE/FHTBM Elementary Data Structures 3 29 september 2014 2/14
Symbol Tables geordende symbool-tabel Symbol Table Definition Een symbol table is een datastructuur voor key-value paren die twee operaties ondersteunt: insert (put) een nieuw paar in de tabel, en search (get) de waarde die aan een gegeven key is gekoppeld. Veel talen hebben een datastructuur van deze vorm. ODE/FHTBM Elementary Data Structures 3 29 september 2014 3/14
ADT voor een symbol table geordende symbool-tabel De put en get operaties moeten natuurlijk aanwezig zijn! De rest op de constructor na is optioneel. ADT ST { // Symbol Table ST () void put (key, value ) value get ( key ) void delete ( key ) boolean contains ( key ) boolean isempty () int size () ODE/FHTBM Elementary Data Structures 3 29 september 2014 4/14
Aspecten van symbol tables geordende symbool-tabel Generics In Java aanwezig sinds jdk5. Duplicate keys Algemene afspraak is geen duplcate sleutels. Zoals bekend van associated arrays. Null keys Niet toegestaan! Null values Zijn toegestaan, maar de bijbehorende sleutels worden verondersteld niet aanwezig te zijn. Deletion Twee mogelijke startegiën kunnen worden gevolgd: lazy of eager. Iteration Een keys() methode zou een Iterator of een Set kunnen teruggeven. Key equality Overschrijven van de equals-methode in de klasse van het key-type moet gebeuren. De equals-methode wordt gebruikt om te controleren of een key aanwezig is. ODE/FHTBM Elementary Data Structures 3 29 september 2014 5/14
Geordende Symbol Tables geordende symbool-tabel Het zou vreemd zijn als de keys niet met elkaar te vergelijken zijn. In Java zal de klasse van het type van de key het Comparable interface implementeren. Dat betekent dat de methode compareto(key) deel uitmaakt van de interface. In plaats van de keys van het type Comparable te maken kan men ook een comparator aan de symbol table geven. Zie bijvoorbeeld de klasse java.util.treeset die als optie een constructor heeft met een Comparator als argument. Keys kunnen als volgt vergeleken worden: comparator.compare(key1, key2). Sommige methoden in de ADT uit het boek staan niet op de volgende sheet. Deze methoden zijn alleen voor het gemak gemaakt: deletemin(), deletemax(), size(lowkey,highkey). ODE/FHTBM Elementary Data Structures 3 29 september 2014 6/14
geordende symbool-tabel ADT voor een geordende symbol table De min, max, select, rank operaties moeten natuurlijk aanwezig zijn. ADT OST { // Ordered Symbol Table OST () void put (key, value ) value get ( key ) void delete ( key ) boolean contains ( key ) boolean isempty () int size () key min () key max () key ceiling () key floor () int rank ( key ) key select ( rank ) void deletemax () void deletemin () ODE/FHTBM Elementary Data Structures 3 29 september 2014 7/14
geordende symbool-tabel : interne datastructuur en constructor class SortedSTList { private int size ; private Node list ; private class Node { Key key ; Value val ; Node next ; Node ( Key key, Value val, Node nxt ) { this. key = key ; this. val = val ; next = nxt ; public SortedSTList () { this. list = new Node (null, null, null ); ODE/FHTBM Elementary Data Structures 3 29 september 2014 8/14
: put en get methoden geordende symbool-tabel public void put ( Key key, Value val ) { Node x = list ; while (x. next!= null && x. next. key. compareto ( key ) < 0) { x = x. next ; if (x. next!= null && x. next. key. equals ( key )) { x. next. val = val ; else { x. next = new Node (key, val, x. next ); size ++; public Value get ( Key key ) throws STException { for ( Node t = list. next ; t!= null ; t = t. next ) { if (t. key. equals ( key )) return t. val ; throw new STException (" Key not in this symbol table!"); public int size () { return size ; ODE/FHTBM Elementary Data Structures 3 29 september 2014 9/14
binaire boom Anatomie van een binaire boom In datastructuren 1&2 zagen we reeds een binaire boom. root node left child right child subtree root......... leaf node......... ODE/FHTBM Elementary Data Structures 3 29 september 2014 10/14
BST definitie Symbol Tables binaire boom Binary Search Tree Definition Een binary search tree is een binaire boom waarin elke node een Comparable key heeft (met geasocieerde waarde), met de afspraak dat de key in elke node groter is dan alle keys in alle nodes van de linker subtree en kleiner is dan de key in alle nodes van de rechter subtree. ODE/FHTBM Elementary Data Structures 3 29 september 2014 11/14
binaire boom : interne datastructuur en constructor public class BinarySearchTree { private class Node { Key key ; Value value ; Node left, right ; public Node ( Key key, Value value ) { this. key = key ; this. value = value ; private int N; private Node bst ; public BinarySearchTree () { N = 0; public int size () { return N; ODE/FHTBM Elementary Data Structures 3 29 september 2014 12/14
binaire boom : recursieve get methode public Value get ( Key key ) { return get (bst, key ); private Value get ( Node x, Key key ) { if ( x == null ) { return null ; int cmp = key. compareto (x. key ); if ( cmp < 0) return get ( x. left, key ); else if ( cmp > 0) return get ( x. right, key ); else return x. value ; ODE/FHTBM Elementary Data Structures 3 29 september 2014 13/14
binaire boom : recursieve put methode public void put ( Key key, Value val ) { bst = put (bst, key, val ); private Node put ( Node x, Key key, Value val ) { if (x == null ) { N ++; return new Node ( key, val ); int cmp = key. compareto (x. key ); if ( cmp < 0) x. left = put (x.left, key, val ); else if ( cmp > 0) x. right = put ( x. right, key, val ); else x. value = val ; return x; ODE/FHTBM Elementary Data Structures 3 29 september 2014 14/14