Professional Documents
Culture Documents
Data Structures
Data Structures
Data Structures
Matthias Baitsch
Vietnamese-German Universit y
Introduction
A data structure is a particular way of storing and organizing data
in a computer so that it can be used efficiently
L :=< 0, 1, 1, 2, 3, 5, 8, 13 >
p r i v a t e d o u b l e [ ] e l e m e n t s = new d o u b l e [ 0 ] ;
p u b l i c void i n s e r t ( i n t i , double x ) {
i f ( i < 0 | | i > this . size ()) {
throw new I n d e x O u t O f B o u n d s E x c e p t i o n ( ” I n d e x : ” + i ) ;
}
d o u b l e [ ] tmp = new d o u b l e [ t h i s . s i z e ( ) + 1 ] ;
f o r ( i n t j = 0 ; j < i ; j ++) {
tmp [ j ] = t h i s . e l e m e n t s [ j ] ;
}
tmp [ i ] = x ;
for ( int j = i ; j < this . size (); j ++) {
tmp [ j + 1 ] = t h i s . e l e m e n t s [ j ] ;
}
t h i s . e l e m e n t s = tmp ;
}
p u b l i c v o i d add ( d o u b l e x ) {
this . insert ( this . size () , x );
}
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
A r r a y L i s t D o u b l e l i s t = new A r r a y L i s t D o u b l e ( ) ;
list . add ( 5 . 0 ) ;
list . add ( 4 . 0 ) ;
list . set (0 , 1 . 0 ) ;
list . print ();
l i s t . i n s e r t (1 , 3 . 0 ) ;
l i s t . print ();
l i s t . add ( 5 . 0 ) ;
l i s t . remove ( 2 ) ;
l i s t . print ();
}
}
Demo Program
p u b l i c c l a s s ArrayListDoubleDemoProgram {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
A r r a y L i s t D o u b l e l i s t = new A r r a y L i s t D o u b l e ( ) ;
list . add ( 5 . 0 ) ;
list . add ( 4 . 0 ) ;
list . set (0 , 1 . 0 ) ;
list . print ();
l i s t . i n s e r t (1 , 3 . 0 ) ;
l i s t . print ();
l i s t . add ( 5 . 0 ) ;
l i s t . remove ( 2 ) ;
l i s t . print ();
}
}
1 4 ArrayListDouble
elements
1 3 4
1 4 ArrayListDouble
elements
1 3 4
ArrayListDouble
elements
1 3 4
I The two links allow walking along the list in either direction
with equal ease.
I The previous node of the head is the last node of the list
I Normally, a special head node is used
Example: Polygon
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
V i e w e r v = new V i e w e r ( ) ;
P o l y g o n p = new P o l y g o n ( ) ;
PNode n = p . f i n d B e f o r e ( 8 . 0 , 4 . 0 ) ;
n . p r i n t ( ” Found : ” ) ;
System . o u t . p r i n t l n ( ) ;
p . remove ( 7 . 0 , 3 . 0 ) ;
p. print ();
p . draw ( v ) ;
v . s e t V i s i b l e ( true ) ;
}
}
Program output
Program output
Polygon PNode
- head: PNode - x: double
+ addFirst(x: double, y: double) - y: double
+ findBefore(x: double, y: double): PNode - next: PNode
+ remove(x: double, y: double): void + PNode(x: double, y: double, next: PNode)
+ draw(v: Viewer): void + setNext(next: PNode): void
+ print(): void + getNext(): PNode
+ getX(): double
+ getY(): double
+ print(l: String): void
UML class diagram
Polygon PNode
- head: PNode - x: double
+ addFirst(x: double, y: double) - y: double
+ findBefore(x: double, y: double): PNode - next: PNode
+ remove(x: double, y: double): void + PNode(x: double, y: double, next: PNode)
+ draw(v: Viewer): void + setNext(next: PNode): void
+ print(): void + getNext(): PNode
+ getX(): double
+ getY(): double
+ print(l: String): void
p u b l i c c l a s s Polygon {
public void p r i n t () {
Node node = head . g e t N e x t ( ) ;
w h i l e ( node != n u l l ) {
node . p r i n t ( ”−>” ) ;
node = node . g e t N e x t ( ) ;
}
System . o u t . p r i n t l n ( ) ;
}
w h i l e ( n . g e t N e x t ( ) != n u l l ) {
i f ( n . g e t N e x t ( ) . getX ()==x && n . g e t N e x t ( ) . getY ()==y ) {
return n ;
}
n = n . getNext ( ) ;
}
return null ;
}
Other interesting methods
Find node before a specified node
p u b l i c PNode f i n d B e f o r e ( d o u b l e x , d o u b l e y ) {
PNode n = t h i s . head ;
w h i l e ( n . g e t N e x t ( ) != n u l l ) {
i f ( n . g e t N e x t ( ) . getX ()==x && n . g e t N e x t ( ) . getY ()==y ) {
return n ;
}
n = n . getNext ( ) ;
}
return null ;
}
Remove a node
Other interesting methods
Find node before a specified node
p u b l i c PNode f i n d B e f o r e ( d o u b l e x , d o u b l e y ) {
PNode n = t h i s . head ;
w h i l e ( n . g e t N e x t ( ) != n u l l ) {
i f ( n . g e t N e x t ( ) . getX ()==x && n . g e t N e x t ( ) . getY ()==y ) {
return n ;
}
n = n . getNext ( ) ;
}
return null ;
}
Remove a node
p u b l i c v o i d remove ( d o u b l e x , d o u b l e y ) {
PNode n = t h i s . f i n d B e f o r e ( x , y ) ;
PNode newNextNode = n . g e t N e x t ( ) . g e t N e x t ( ) ;
n . s e t N e x t ( newNextNode ) ;
}
Other interesting methods
Draw polygon
Other interesting methods
Draw polygon
p u b l i c v o i d draw ( V i e w e r v ) {
P o l y l i n e p o l y l i n e = new P o l y l i n e ( ) ;
PNode node = t h i s . head . g e t N e x t ( ) ;
w h i l e ( node != n u l l ) {
p o l y l i n e . a d d V e r t e x ( node . getX ( ) , node . getY ( ) , 0 , 0 ) ;
node = node . g e t N e x t ( ) ;
}
node = t h i s . head . g e t N e x t ( ) ;
p o l y l i n e . a d d V e r t e x ( node . getX ( ) , node . getY ( ) , 0 ) ;
p o l y l i n e . setColor (” black ” );
v . addObject3D ( p o l y l i n e ) ;
}
Trees . . .
Trees
I Trees describe hierarchical structures of elements based on a
set of linked nodes
I Each node in a tree stores an element and has zero or more
child nodes, which are below it in the tree
I The topmost node in a tree is called the root node
I Nodes at the bottommost level of the tree are called leaf
nodes
Types of trees
I Any node in a tree T, together with all the nodes below it,
comprise a so-called subtree of T
I Different tree types are distinguished by the number of
possible child nodes
I Binary trees
I Quad trees
I Oct trees
I Often trees are used to store elements in a certain order
Binary tree
See exercise. . .
Excursus: Interfaces. . .
Interfaces by example
p u b l i c void a d d F i r s t ( double x ) ;
ListOfDoubles
{interface}
+ addFirst(x: double): void
+ print(l: String): void
ArrayListOfDoubles LinkedListOfDoubles
- values: double[] - head: Node
+ addFirst(x: double): void + addFirst(x: double): void
+ print(l: String): void + print(l: String): void
p r i v a t e double [ ] v a l u e s = new d o u b l e [ 0 ] ;
p u b l i c void a d d F i r s t ( double x ) {
int n = this . values . length ;
d o u b l e [ ] tmp = new d o u b l e [ n + 1 ] ;
tmp [ 0 ] = x ;
System . a r r a y c o p y ( t h i s . v a l u e s , 0 , tmp , 1 , n ) ;
t h i s . v a l u e s = tmp ;
}
p u b l i c c l a s s L i n k e d L i s t O f D o u b l e s implements L i s t O f D o u b l e s {
p u b l i c void a d d F i r s t ( double x ) {
Node n = new Node ( x , t h i s . head . g e t N e x t ( ) ) ;
t h i s . head . s e t N e x t ( n ) ;
}
System . o u t . p r i n t ( l + ”<” ) ;
w h i l e ( n != n u l l ) {
System . o u t . p r i n t ( n . g e t V a l u e ( ) + ” ” ) ;
n = n . getNext ( ) ;
}
System . o u t . p r i n t l n ( ”>” ) ;
}
}
Demo program
p u b l i c c l a s s ListOfDoublesDemoProgram {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
L i s t O f D o u b l e s l 1 = new A r r a y L i s t O f D o u b l e s ( ) ;
L i s t O f D o u b l e s l 2 = new L i n k e d L i s t O f D o u b l e s ( ) ;
l1 . addFirst (1.1);
l1 . addFirst (6.2);
l1 . addFirst (9.4);
l2 . addFirst (1.1);
l2 . addFirst (6.2);
l2 . addFirst (9.4);
l1 . p r i n t ( ” l 1=” ) ;
l2 . p r i n t ( ” l 2=” ) ;
}
}
Demo program
p u b l i c c l a s s ListOfDoublesDemoProgram {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
L i s t O f D o u b l e s l 1 = new A r r a y L i s t O f D o u b l e s ( ) ;
L i s t O f D o u b l e s l 2 = new L i n k e d L i s t O f D o u b l e s ( ) ;
l1 . addFirst (1.1);
l1 . addFirst (6.2);
l1 . addFirst (9.4);
l2 . addFirst (1.1);
l2 . addFirst (6.2);
l2 . addFirst (9.4);
l1 . p r i n t ( ” l 1=” ) ;
l2 . p r i n t ( ” l 2=” ) ;
}
}
l 1 =<9.4 6 . 2 1 . 1 >
l 2 =<9.4 6 . 2 1 . 1 >
Demo program
p u b l i c c l a s s ListOfDoublesDemoProgram {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
L i s t O f D o u b l e s l 1 = new A r r a y L i s t O f D o u b l e s ( ) ;
L i s t O f D o u b l e s l 2 = new L i n k e d L i s t O f D o u b l e s ( ) ;
l1 . addFirst (1.1);
l1 . addFirst (6.2);
l1 . addFirst (9.4);
l2 . addFirst (1.1);
l2 . addFirst (6.2);
l2 . addFirst (9.4);
l1 . p r i n t ( ” l 1=” ) ;
l2 . p r i n t ( ” l 2=” ) ;
}
}
l 1 =<9.4 6 . 2 1 . 1 >
l 2 =<9.4 6 . 2 1 . 1 >
l1 . add ( 1 . 0 ) ;
l1 . add ( P I ) ;
l1 . add ( 1 . 0 ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
l2 . add ( ” S t r a w i n s k y ” ) ;
l2 . add ( ” Bach ” ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
System . o u t . p r i n t ( ” Numbers : ” ) ;
f o r ( double d : l 1 ) {
System . o u t . p r i n t ( d + ” ” ) ;
}
System . o u t . p r i n t ( ” \ nComposers : ” ) ;
for ( String s : l2 ) {
System . o u t . p r i n t ( s + ” ” ) ;
}
List demo program
L i s t <Double> l 1 = new A r r a y L i s t <Double > ( ) ;
L i s t <S t r i n g > l 2 = new L i n k e d L i s t <S t r i n g > ( ) ;
l1 . add ( 1 . 0 ) ;
l1 . add ( P I ) ;
l1 . add ( 1 . 0 ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
l2 . add ( ” S t r a w i n s k y ” ) ;
l2 . add ( ” Bach ” ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
System . o u t . p r i n t ( ” Numbers : ” ) ;
f o r ( double d : l 1 ) {
System . o u t . p r i n t ( d + ” ” ) ;
}
System . o u t . p r i n t ( ” \ nComposers : ” ) ;
for ( String s : l2 ) {
System . o u t . p r i n t ( s + ” ” ) ;
}
Numbers : 1 . 0 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 1 . 0
Composers : B e e t h o v e n S t r a w i n s k y Bach B e e t h o v e n
Set demo program
Set<Double> l 1 = new HashSet<Double > ( ) ;
Set<S t r i n g > l 2 = new T r e e S e t <S t r i n g > ( ) ;
l1 . add ( 1 . 0 ) ;
l1 . add ( P I ) ;
l1 . add ( 1 . 0 ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
l2 . add ( ” S t r a w i n s k y ” ) ;
l2 . add ( ” Bach ” ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
System . o u t . p r i n t ( ” Numbers : ” ) ;
f o r ( double d : l 1 ) {
System . o u t . p r i n t ( d + ” ” ) ;
}
System . o u t . p r i n t ( ” \ nComposers : ” ) ;
for ( String s : l2 ) {
System . o u t . p r i n t ( s + ” ” ) ;
}
Set demo program
Set<Double> l 1 = new HashSet<Double > ( ) ;
Set<S t r i n g > l 2 = new T r e e S e t <S t r i n g > ( ) ;
l1 . add ( 1 . 0 ) ;
l1 . add ( P I ) ;
l1 . add ( 1 . 0 ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
l2 . add ( ” S t r a w i n s k y ” ) ;
l2 . add ( ” Bach ” ) ;
l2 . add ( ” B e e t h o v e n ” ) ;
System . o u t . p r i n t ( ” Numbers : ” ) ;
f o r ( double d : l 1 ) {
System . o u t . p r i n t ( d + ” ” ) ;
}
System . o u t . p r i n t ( ” \ nComposers : ” ) ;
for ( String s : l2 ) {
System . o u t . p r i n t ( s + ” ” ) ;
}
Numbers : 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 1 . 0
Composers : Bach B e e t h o v e n S t r a w i n s k y
Summary
K,V
Map
{interface}
+ put(key: K, value: V): V K,V
+ get(key: K): V HashMap
+ keySet(): Set<K> ...
+ size(): int ...
...
K,V K,V
SortedMap TreeMap
{interface} ...
... ...
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
Map<C h a r a c t e r , I n t e g e r > cm = new HashMap<C h a r a c t e r , I n t e g e r > ( ) ;
cm . p u t ( ’ a ’ , 9 9 ) ;
cm . p u t ( ’ b ’ , 1 ) ;
cm . p u t ( ’ c ’ , 6 ) ;
cm . p u t ( ’ d ’ , 8 5 ) ;
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
Map<C h a r a c t e r , I n t e g e r > cm = new HashMap<C h a r a c t e r , I n t e g e r > ( ) ;
cm . p u t ( ’ a ’ , 9 9 ) ;
cm . p u t ( ’ b ’ , 1 ) ;
cm . p u t ( ’ c ’ , 6 ) ;
cm . p u t ( ’ d ’ , 8 5 ) ;
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
f o r ( c h a r k e y : cm . k e y S e t ( ) ) {
System . o u t . p r i n t ( k e y + ”−>” + cm . g e t ( k e y ) + ” ” ) ;
}
Complexity of operations
Complexity of operations
String url =
” h t t p : / /www . g u t e n b e r g . o r g / f i l e s /4300/4300 −8. t x t ” ;
Book b = new Book ( u r l ) ;
b. addImportantPerson (” Mulligan ” ) ;
b. addImportantPerson ( ” Molly ” ) ;
b. a d d I m p o r t a n t P e r s o n ( ” Bloom ” ) ;
b. addImportantPerson ( ” Dedalus ” ) ;
b. listAppearances ();
Demo program
String url =
” h t t p : / /www . g u t e n b e r g . o r g / f i l e s /4300/4300 −8. t x t ” ;
Book b = new Book ( u r l ) ;
b. addImportantPerson (” Mulligan ” ) ;
b. addImportantPerson ( ” Molly ” ) ;
b. a d d I m p o r t a n t P e r s o n ( ” Bloom ” ) ;
b. addImportantPerson ( ” Dedalus ” ) ;
b. listAppearances ();
M u l l i g a n : 115
M o l l y : 41
D e d a l u s : 116
Bloom : 428
Basic methods
p u b l i c c l a s s Book {
p r i v a t e URL u r l ;
p r i v a t e Set<S t r i n g > p e r s o n s = new HashSet<S t r i n g > ( ) ;
p u b l i c Book ( S t r i n g u r l ) t h r o w s I O E x c e p t i o n {
t h i s . u r l = new URL( u r l ) ;
}
// o t h e r methods come h e r e . . .
}
List persons
p u b l i c void l i s t A p p e a r a n c e s ( ) throws IOException {
S c a n n e r s c a n n e r = new S c a n n e r ( t h i s . u r l . o p e n S t r e a m ( ) ) ;
Map<S t r i n g , I n t e g e r > a p p e a r a n c e s
= new TreeMap<S t r i n g , I n t e g e r > ( ) ;
Statement of problem
Given: A domain where each point of the domain is
associated with a certain property, e.g. the color.
Quadtrees
Statement of problem
Given: A domain where each point of the domain is
associated with a certain property, e.g. the color.
Needed: A partitioning of the domain into simple, rectangular
subdomains having mostly uniform properties.
Quadtrees
1 2
1 2 3 4
3 4
1 2 3 4
1 2 3 4
1 2 3 4 1 2 3 4
Domain with properties Partitioning of domain Corresponding quadtree
Statement of problem
Given: A domain where each point of the domain is
associated with a certain property, e.g. the color.
Needed: A partitioning of the domain into simple, rectangular
subdomains having mostly uniform properties.
Solution idea
I Recursively refine region where needed
I Store rectangles in a tree-like data structure
I Each node in the tree represents one rectangle
I A tree node can have either zero or four subnodes
Applications of quadtrees
1 2 3 4 5
Domain class in Java
p u b l i c c l a s s Domain {
p u b l i c Domain ( S t r i n g f i l e n a m e , i n t n C o l o r s )
throws IOException {
d o u b l e dc = 2 5 5 . 0 / n C o l o r s ;
// o t h e r methods go h e r e ...
}
Getting the color index
p u b l i c i n t c o l o r I d x A t ( double x , double y ) {
i n t iw = t h i s . image . g e t W i d t h ( n u l l ) ;
i n t i h = t h i s . image . g e t H e i g h t ( n u l l ) ;
i n t px = ( i n t ) ( x ∗ iw ) ;
i n t py = ( i n t ) ( i h − y ∗ i h ) ;
C o l o r c = new C o l o r ( t h i s . image . getRGB ( px , py ) ) ;
i n t b = ( c . getRed ( ) + c . getGreen ( ) + c . g e t B l u e ( ) ) / 3 ;
int idx = Arrays . binarySearch ( this . colors , b ) ;
i f ( i d x >= 0 ) {
return idx ;
} else {
r e t u r n −i d x − 1 ;
}
}
i f ( i d x != t h i s . c o l o r I d x A t ( px , py ) ) {
return false ;
}
}
}
return true ;
}
(0.1 , 0.1): 4
(0.1 , 0.9): 6
(0.8 , 0.2): 3
(0.1 , 0.1 , 0.1): true
(0.0 , 0.0 , 1.0): false
(0.3 , 0.3 , 0.4): false
The QuadTree class
QuadTree
- root: QuadTreeNode
+ QuadTree(d: Domain, depth: int)
+ draw(ov: boolean, cm: int, v: Viewer): void
QuadTree class
I Pointer to root node
I Specify domain and refinement depth in constructor
I Draw quadtree, parameters determine appearance
The QuadTreeNode class
QuadTreeNode
- colorIdx: int
- nodes: QuadTreeNode[]
- size: double
- x: double
- y: double
+ QuadTreeNode(d: Domain, x: double, y: double, size: double)
+ draw(ps: PolygonSet): void
+ refine(d: Domain, depth: int): void
- isLeaf(): boolean
QuadTreeNode class
I Specify domain, position and size in constructor
I Draw using a PolygonSet
I Refine up to the specified level
I Check if the node is a leaf not (i.e. does not have subnodes)
QuadTree in Java
p u b l i c c l a s s QuadTree {
p r i v a t e QuadTreeNode r o o t ;
p u b l i c QuadTree ( Domain d , i n t d e p t h ) {
t h i s . r o o t = new QuadTreeNode ( d , 0 . 0 , 0 . 0 , 1 . 0 ) ;
t h i s . r oot . r e f i n e (d , depth ) ;
}
p u b l i c v o i d draw ( b o o l e a n ov , i n t cm , V i e w e r v ) {
P o l y g o n S e t p s = new P o l y g o n S e t ( ) ;
t h i s . r o o t . draw ( p s ) ;
ps . s e t C o l o r i n g B y D a t a ( t r u e ) ;
p s . s e t O u t l i n e s V i s i b l e ( ov ) ;
p s . s e t C o l o r M o d e (cm ) ;
ps . c r e a t e C o l o r s ( ) ;
v . addObject3D ( p s ) ;
}
}
QuadTreeNode in Java
p u b l i c c l a s s QuadTreeNode {
p u b l i c QuadTreeNode ( Domain d , d o u b l e x , d o u b l e y ,
double s i z e ) {
double s2 = s i z e / 2 ;
t h i s . c o l o r I d x = d . c o l o r I d x A t ( x + s2 , y + s 2 ) ;
this . x = x ;
this . y = y ;
this . size = size ;
}
p r i v a t e boolean i s L e a f () {
r e t u r n t h i s . n o d e s == n u l l ;
}
// o t h e r methods go h e r e ...
}
Refinement procedure