Algoritmer och datastructurer -En annan sort tänkande, rekursiva metoder -Datastrukturen träd Binärt träd -Filkomprimering med Huffmanträd -- Kapitel 18 , 12 För utveckling av verksamhet, produkter och livskvalitet. Rekursion ? En rekursiv metod är en metod som anropar sig själv. Liknar loopar / iterationer Mycket kraftfull men något förvirrande... Rekursion är ett sätt att lösa ett problem genom att dela problemmet i flera identiska men mindre subproblem, dvs. metoden anropar sig själv med ” ett mindre argument”. Summan av 1+2+3+4+5 + ......+n För utveckling av verksamhet, produkter och livskvalitet. Exempel public static int sumOf(int n) { if(n==1) !! basfall return 1; else return sumOf(n-1) +n; } Se till att den rekursiva anropet alltid leder till basfallet För utveckling av verksamhet, produkter och livskvalitet. Vad är ett träd datastruktur? En abstaction som beskriver ...ja..just det... För utveckling av verksamhet, produkter och livskvalitet. Datoranpassad träd... För utveckling av verksamhet, produkter och livskvalitet. Var finns träd? Fil / Katalog strukturer! Sökning och sortering Filkomprimenring Kompilatorer För utveckling av verksamhet, produkter och livskvalitet. Ny terminologi! • • • • • • • • Nod Kant Rot Löv Förälder Barn Djup Höjd 02 1 20 20 För utveckling av verksamhet, produkter och livskvalitet. 1 1 20 20 20 20 Lite mer komplicerat träd • • • • • 11 0 3 Rot Löv Djup Höjd Storlek A 113 01 1 B 12 0 F 2 1 D C 2 1 0 G 2 10 H 2 14 E 2 10 I 2 21 J 10 3 K För utveckling av verksamhet, produkter och livskvalitet. Funktioner på träd • Typiska funktioner (oftast rekursiva!) • Antalet noder i ett träd • Listning (traversering) av trädstrukturen För utveckling av verksamhet, produkter och livskvalitet. Speciella träd • Binära träd • Maximalt två barn / nod • Vänster / höger barn a b d c e f För utveckling av verksamhet, produkter och livskvalitet. Implementation- noden class BinaryNode{ private Object element; private BinaryNode left; private BinaryNode right; public BinaryNode( Object theElement, BinaryNode lt, BinaryNode rt){ element=theElement; left=lt; right=rt; } public BinaryNode(){ this( null,null,null); } } För utveckling av verksamhet, produkter och livskvalitet. element left right Implementation - metoder - public Object getElement() public BinaryNode getLeft() public void printPreorder() public void printPostOrder() public void printInOrder(); public static int size(BinaryNode n) public static int height( BinaryNode n) - ............................................................... För utveckling av verksamhet, produkter och livskvalitet. Metoden –size() public static int size(BinaryNode n) { if (n==null) return 0; else return 1+size(n.left)+size(n.right); } För utveckling av verksamhet, produkter och livskvalitet. Metoden printPreorder() a public void printPreorder(){ System.out.println(element); if(left!=null) left.printPreorder(); if(rigth!=null) right.printPreorder(); } b e a b För utveckling av verksamhet, produkter och livskvalitet. c f e f c Metoden printPostOrder() a public void printPostOrder(){ if(left!=null) left.printPostOrder(); if(rigth!=null) right.printPostOrder(); System.out.println(element); b e f } e f För utveckling av verksamhet, produkter och livskvalitet. c b c a BinaryTree klassen class BinaryTree{ private BinaryNod root; public BinaryTree( Object item){ root=new BinaryNode(item,null,null); } public BinaryTree(){ root=null; } } För utveckling av verksamhet, produkter och livskvalitet. BinaryTree-metoden merge() public void merge( Object item, BinaryTree t1, BinaryTree t2) { // Testa om inte t1 och t2 är samma träd if( t1.root== t2.root && t1.root!=null) // rapportera fel root = new BinaryNode( item, t1.root,t2.root); if(this!=t1) t1.root=null; if(this!=t2) t2.root=null; } För utveckling av verksamhet, produkter och livskvalitet. void printPostOrder(){ Tillämpning-Uttrycksträd public if(left!=null) left.printPostOrder(); if(rigth!=null) right.printPostOrder(); System.out.println(element); } * + a b a För utveckling av verksamhet, produkter och livskvalitet. b Tillämpning-datakomprimering a d b c För utveckling av verksamhet, produkter och livskvalitet. Datakomprimering - Huffman Hej, mitt namn är Nicolina och jag försöker få mina studenter att se tjusningen i träd och komprimeringsalgoritmer! 01001000 01100101 01101010 00101100 00100000 01101101 01101001 01110100 01110100 00100000 01101110 01100001 01101101 01101111 00100000 10000100 ... För utveckling av verksamhet, produkter och livskvalitet. Datakomprimering - Huffman 01001000 01100101 01101010 00101100 00100000 01101101 01101001 01110100 01110100 00100000 01101110 01100001 01101101 01101111 00100000 10000100 ... 101 1110 010 01 111 10 ... 011 01 11 100 1101 101 10 011 001 1100 101 01 011 11 1101 10 001 1110 111 01 100 101 011 1100 010 10 ... För utveckling av verksamhet, produkter och livskvalitet. Datakomprimering - Huffman I II III IV V 01001101 01101101 00110101 10101001 01010111 0 25 ggr 1 31 ggr 5 ggr 19 ggr IV 14 ggr III II I V För utveckling av verksamhet, produkter och livskvalitet. I = II = III = IV = V = 11 10 000 01 001