Java Programma structuur public class Bla // div. statements public static void main(string argv[]) // meer spul Voortgezet Prog. voor KI, week 4:11 november 2002 1
Lijsten Voorbeelden 2, 3, 5, 7, 13 Jan, Piet, Klaas (Jan, 8), (Piet, 1), (Klaas, 7) Jan 8 Piet 1 Klaas 7 Voortgezet Prog. voor KI, week 4:11 november 2002 2
Class-structuur Probleem: lege lijst moet kunnen, maar een null object heeft geen methods. Oplossing: public class List private class ListNode // Data fields public Object info; public ListNode next; // Methods... private ListNode head; Voortgezet Prog. voor KI, week 4:11 november 2002 3
Constructors voor ListNode private class ListNode // Data fields public Object info; public ListNode next; // Methods public ListNode(Object obj) info = obj; next = null; public ListNode( Object obj, ListNode nextnode) info = obj; next = nextnode; Voortgezet Prog. voor KI, week 4:11 november 2002 4
Methods add : object clone : List append : List first : Object tail : List isempty : boolean tostring : String Voortgezet Prog. voor KI, week 4:11 november 2002 5
Method add Voegt een element vooraan de lijst toe public void add( Object e ) // Voegt een element vooraan de lijst toe ListNode temp = new ListNode(e); temp.next = head; head = temp; Een alternatief is: public void add( Object e ) // Voegt een element vooraan de lijst toe head = new ListNode(e, head); Voortgezet Prog. voor KI, week 4:11 november 2002 6
Verwijderen nodes Method in private class ListNode: public ListNode tail( ) // Verwijder een element vooraan de lijst return next; Method in class List: public boolean remove( Object e ) // Verwijder een element met inhoud \texttte if (!isempty()) if (((Comparable)root.info).compareTo(e) == 0 ) root = root.tail(); return true; else boolean found = false; ListNode temp = root; while ( (temp.next!= null) && (! found )) if (((Comparable)temp.next.info).compareTo(e)==0) found=true; else temp=temp.next; if (found) temp.next=temp.next.tail(); return found; else return true; Voortgezet Prog. voor KI, week 4:11 november 2002 7
tostring Method in private class ListNode: public String tostring() if (next!= null) return info.tostring() + "\n" + next.tostring(); else return info.tostring() + "\n"; OF: public String tostring() return info.tostring() + "\n" + ( next == null? "" : next.tostring()); Method in class List: public String tostring() if (!isempty()) return root.tostring(); else return ""; Voortgezet Prog. voor KI, week 4:11 november 2002 8
Gebruik... maak een lege lijst List list = new List(); maak het lijstje 1, 2, 3 list.add( (Integer(3) ); list.add( (Integer(2) ); list.add( (Integer(1) ); Voortgezet Prog. voor KI, week 4:11 november 2002 9
Bomen root node / * + a b c - leaf d e Voortgezet Prog. voor KI, week 4:11 november 2002 10
Bomen Terminologie? Boom, Tree Knoop, Node Blad, Leaf Wortel, Root Diepte, Depth Linker Subboom, Left Subtree Rechter Subboom, Right Subtree Soorten bomen: Binaire boom N-aire boom Geordende of zoekbomen Gebalanceerde bomen Gebalanceede binaire zoekbomen Voortgezet Prog. voor KI, week 4:11 november 2002 11
Toepassingen Binaire expressies: binaire bomen Database: gebalanceede binaire zoekbomen Woordenboek: N-aire zoekbomen Statement: boom Decoder prefix code: binaire boom Statement block: woud Woud = Lijst van Bomen Voortgezet Prog. voor KI, week 4:11 november 2002 12
Hufman code symbool code A 0 B 10 C 1100 D 1101 E 1110 F 1111 A 0 0 B 10 1 0 0 C 1100 1 1 0 0 1 E D 1101 1110 1 F 1111 Voortgezet Prog. voor KI, week 4:11 november 2002 13
Binaire boom private class TreeNode // Data fields private Object info; private TreeNode left; private TreeNode right; // Methods // Constructors public TreeNode(Object obj) info = (Comparable) obj; left = null; right = null; public TreeNode( Object obj, TreeNode leftnode, TreeNode rightnode) info = (Comparable) obj; left = leftnode; right = rightnode; Voortgezet Prog. voor KI, week 4:11 november 2002 14
Binaire ZOEKboom public class SearchTree private class TreeNode // Data fields private Comparable info; private TreeNode left; private TreeNode right; // Methods within TreeNode... // Data fields public TreeNode root; // Methods within SearchTree Voortgezet Prog. voor KI, week 4:11 november 2002 15
Alternatieve binaire boom private class TreeNode // Data fields private Object info; private TreeNode[] children; // Methods // Constructors public TreeNode(Object obj) info = (Comparable) obj; children = new TreeNode[2];... Voortgezet Prog. voor KI, week 4:11 november 2002 16
Simpele extensie naar N-aire boom private class TreeNode // Data fields private Object info; private TreeNode[] children; // Methods // Constructors public TreeNode(Object obj, int numchildren) info = (Comparable) obj; children = new TreeNode[numchildren];... Voortgezet Prog. voor KI, week 4:11 november 2002 17
Creatie expressieboom root = new TreeNode ( "/", new TreeNode ( "*", new TreeNode( "a"), new TreeNode( "b" ) ), new TreeNode ( +, new TreeNode( "c" ), new TreeNode ( -, new TreeNode( "d" ), new TreeNode( "e" ) ) ) ); Voortgezet Prog. voor KI, week 4:11 november 2002 18
Doorlopen boom preorder - wortel, linker subboom, rechter subboom inorder - linker subboom, wortel, rechter subboom postorder - linker subboom, rechter subboom, wortel public preorderdosomething ( ) info.dosomething(); if ( left!= null ) left.preorderdosomething( ); if ( right!= null ) right.preorderdosomething( ); public inorderdosomething ( ) if ( left!= null ) left.inorderdosomething( ); info.dosomething(); if ( right!= null ) right.inorderdosomething( ); Voortgezet Prog. voor KI, week 4:11 november 2002 19
Geordende lijsten Geordend: 0, 1, 2, 2, 4, 5, 7, 9 Ongeordend: 5, 9, 2, 7, 4, 0, 2, 1 public void insertordered( Comparable e ) ListIterator iter = this.listiterator(); while (iter.hasnext()) if ( e.compareto((comparable) iter.next()) < 0 ) if (iter.hasprevious()) iter.previous(); break; iter.add(e); Voortgezet Prog. voor KI, week 4:11 november 2002 20
Geordende bomen Toepassing: databases Waarom? : sneller zoeken O log N i.p.v. O N public boolean addnode(object item) // Voegt een element aan de binaire zoekboom toe if ( info.compareto(item) == 0 ) return false; else if ( info.compareto(item) > 0 ) // item.key < root.key if ( left == null ) left = new TreeNode(item); return true; // new item added else return left.addnode(item); // insert in left tree else // item.key >= root.key if ( right == null ) right = new TreeNode(item); return true; // new item added else return right.addnode(item); // insert in left tree Voortgezet Prog. voor KI, week 4:11 november 2002 21
Geordende Bomen Het schema resulteert in de method add voor SearchTree: public boolean add( Object item ) if ( isempty() ) else root = new TreeNode( item ); return true; return root.addnode( item ); Voortgezet Prog. voor KI, week 4:11 november 2002 22
join Deze method volgt ook het voorgaande patroon. In SearchTree hebben we public void join( SearchTree t ) // Combineer twee binaire zoekbomen if (!isempty() ) root.join(t); En in TreeNode: public void join( SearchTree t ) // Combineer twee binaire zoekbomen t.insert( (Comparable) info); if ( left!= null ) left.join(t); if ( right!= null ) right.join(t); Voortgezet Prog. voor KI, week 4:11 november 2002 23
Verwijderen wortel Gevalsonderscheid: Het te verwijderen element heeft geen opvolgers: (left == null) && (right == null) Het te verwijderen element heeft precies één opvolger: (left == null)!= (right == null) Het te verwijderen element heeft twee opvolgers: (left!= null) && (right!= null) Voortgezet Prog. voor KI, week 4:11 november 2002 24
Verwijderen wortel public TreeNode removeroot() // Verwijder het root element uit een boom TreeNode p; if (left == null) if (right == null) return null; else return tree^.right; else if (right == null) return left; else p = left; while (p.right!= null ) p=p.right; p.right := right; return left; Voortgezet Prog. voor KI, week 4:11 november 2002 25
Verwijderen knoop met bepaalde inhoud public boolean removenode(object item) if ( info.compareto(item) > 0 ) // item.key < root.key if ( left == null ) return false; // no item removed else if (left.info.compareto(item) == 0) left = left.removeroot(); return true; else return left.removenode(item); // remove from left tree else // item.key >= root.key if ( right == null ) return false; // no item removed else if (right.info.compareto(item) == 0) right = right.removeroot(); return true; else return right.removenode(item); // remove from left tree Voortgezet Prog. voor KI, week 4:11 november 2002 26
Verwijderen knoop met bepaalde inhoud Tot slot moet binnen de class SearchTree een method remove gemaakt worden die drie situaties aan moet kunnen: de boom is leeg: dan geven we als returnwaarde false. het root-element is het gezochte element: dan roep je de removeroot method van root aan. in alle overige gevallen moet de removenode method van root aangeroepen worden We krijgen dan: public boolean remove(object target) if (isempty()) return false; else if (root.info.compareto(target)==0) root = root.removeroot(); return false; else return root.removenode(target); Voortgezet Prog. voor KI, week 4:11 november 2002 27
Som der elementen In TreeNode hebben we: public int sumint() int sum = ((Number)info).intValue(); if (left!= null) sum += left.sumint(); if (right!= null) sum += right.sumint(); return sum; Let op dat we eerst info casten naar een Number. En alternatief is: public int sumint() return (left!= null? left.sumint() : 0 ) + (right!= null? right.sumint() : 0 ) + ((Number)info).intValue(); In SearchTree hebben we dan de method: public int sumint() if (isempty()) return 0; else return root.sumint(); Voortgezet Prog. voor KI, week 4:11 november 2002 28