1 / 20

Design Patterns for Self-Balancing Trees

Design Patterns for Self-Balancing Trees. Dung “Zung” Nguyen Stephen Wong Rice University. Resources. http://www.owlnet.rice.edu/~swong/TeachJava. ( http://www.owlnet.rice.edu/~swong/TeachJava/ NTree/presentation/NTree.ppt). http://www.exciton.cs.rice.edu/research/OOPSLA02. Motivations.

stepheny
Download Presentation

Design Patterns for Self-Balancing Trees

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design Patterns for Self-Balancing Trees Dung “Zung” Nguyen Stephen Wong Rice University

  2. Resources http://www.owlnet.rice.edu/~swong/TeachJava (http://www.owlnet.rice.edu/~swong/TeachJava/NTree/presentation/NTree.ppt) http://www.exciton.cs.rice.edu/research/OOPSLA02

  3. Motivations Consider 2-3-4 Trees…. • Classic self-balancing tree structure • Generalizable to B-trees. • Difficult and complex. Who shows real code? • What’s the proper abstraction? • Should be able to extend prior work on decoupling algorithms from data structures.

  4. A A B C A B A 2-3-4 Tree is… • Empty or… • Non-Empty, in 3 possible states: • 2-State: 1 data element + 2 sub-trees. • 3-State: 2 data elements + 3 sub-trees. • 4-State: 3 data elements + 4 sub-trees.

  5. Variant vs. Invariant Operations • Self-balancing insertion is not an intrinsic (invariant) operation of a tree. • What are the invariant operations? • Gettors & Constructors. • Constructive and Destructive operations: • Constructive: Splice a tree into another. • Destructive: Split a tree into a 2-state.

  6. B C A B A A B B C C A C Splittin’ and Splicin’ Splice: Split Up: B Intrinsic operations on the tree STRUCTURE, not the data!

  7. t1.splitUpAt(1) t1.splitDownAt(1) t1 -10 -20 0 10 20 t1.spliceAt(1, t2) -20 0 10 20 -10 t2 -20 -10 0 10 20 α β γ -20 α β γ -10 0 10 20 Structural Operations

  8. t1 t1.splitUpAt(0) t1.splitDownAt(0) 10 10 10 t2 t2.spliceAt(0, t1) Con/De-struction

  9. Host1 Host2 Host3 VisitorA VisitorB Visitor Design Pattern AHost execute(v) AVisitor +case1() +case2() +case3() Invariant: Hosti calls casei of the visitor. Fixed # of methods  fixed # of hosts Non-Extensible!

  10. Host1 Host2 Host3 VisitorA VisitorB Generalized Visitors AHost execute(v) AVisitor +caseAt(int i) Invariant: Hosti calls caseAt(i) of the visitor. Unbounded # of hosts!

  11. TreeN and Algorithms

  12. toString() Algorithm public class ToStringAlgo implements ITreeNAlgo { // Constructors omitted public Object caseAt(int idx, TreeN host, Object key) { switch(idx) { case 0: { return "[ ]"; } default: { String sData= "", sTrees=""; for(int i = 0;i<idx;i++) { sData += host.getDat(i)+" "; sTrees += host.getChild(i).execute(toStringHelp,"| ")+"\n"; } sTrees += host.getChild(idx).execute(toStringHelp," ").toString(); return sData +"\n"+sTrees; } } } ITreeNAlgo toStringHelp = …see next slide…. } Empty Tree Non-Empty Tree “Prefix” data

  13. ToString() Helper private final static ITreeNAlgo toStringHelp = new ITreeNAlgo() { public Object caseAt(int idx, TreeN host, Object prefix) { switch(idx) { case 0: { return "|_[ ]"; } default: { String sData= "", sTrees=""; for(int i = 0;i<idx;i++) { sData += host.getDat(i)+" "; sTrees += prefix + (String) host.getChild(i).execute(this, prefix+"| ")+"\n"; } sTrees += prefix + host.getChild(idx).execute(this, prefix+" " ).toString(); return "|_ "+sData +"\n"+sTrees; } } } }; Empty Tree Non-Empty Tree “Prefix” data

  14. Split-down Collapse/Splice -20 -10 0 10 20 -20 -10 0 10 20 -20 -10 0 5 10 20 Split up Splice 5 5 Vertical Data Transport No net height change except at root and leaves!

  15. invokes Command1 Command2 Command3 Well-defined, but unrelated semantics. Command Design Pattern Invoker Performs a task. ICommand +Object apply(Object inp) No specified semantic! Commands = Lambda Functions Anonymous inner classes provide closures for lambdas!

  16. Insertion Heuristics • Insertion must take place at the leaf. • Tree must grow only at the root. Must transport data from the leaves to the root without affecting the height balance.

  17. Insertion Algorithm • Find insertion point at the leaf and splice new data in. • Use Split-and-Apply visitor to transport excess data upwards. • Visitor passed as parameter to recursive call. • Non-root: split-and-splice • Root node: split-and-no-op will cause entire tree to grow in height. • Abstract the splice/no-op as a command passed to the visitor! Lambdas simplify code!

  18. Deletion Heuristics • Deletion only well-defined at leaf. • Data might exist anywhere in the tree. • Tree can only shorten at root.  Push “candidate” data down from the root to the leaves.  Bubble “excess” data back to the root. Must transport data from the root to the leaves and from the leaves to the root without affecting the height balance.

  19. Deletion Algorithm • Identify candidate data • split down at candidate and collapse with children. • If root is a 2-node, then tree will shorten. • Data to delete will appear as 2-node below leaves. • Use Split-and-Apply to transport excess data upwards. No Rotations!

  20. Conclusions • Proper abstraction leads to • Decoupling • Simplicity • Flexibility & extensibility • Generalized Visitors open up new possibilities. • Self-balancing trees teach • Abstract decomposition • Design patterns • Component-frameworks • Lambda calculus • Proof-of-correctness & complexity analysis

More Related