Transcript Lecture18
CS2 in Java Peer Instruction
Materials by Cynthia Lee is licensed
under a Creative Commons
Attribution-NonCommercial 4.0
International License.
Based on a work
at http://peerinstruction4cs.org.
Permissions beyond the scope of this
license may be available
at http://peerinstruction4cs.org.
CSE 12 – Basic
Data Structures
Cynthia Bailey Lee
Some slides and figures
adapted from Paul Kube’s CSE
12
2
Today’s Topics
1.
2.
TreeMap
HashMap
Review: the Map
Interface
Map Interface
Want
to hold (key, value) associations
Want to be able to “look up” values quickly
using the key
“Siri, what is Diego’s phone number?”
key = “Diego”, value = 858-555-0176
Basic
operations of this ADT are something
like this:
void put(KeyType k, ValueType v)
ValueType get(KeyType k)
ValueType delete(KeyType k)
TreeMap
An implementation of the Map (or “Dictionary”)
interface that has guaranteed log(n) worst case.
Implementing Map interface
with a Binary Search Tree (BST)
Usually
we think of a hash table as the goto implementation of the Map interface
But Binary Search Trees are another
option
C++’s
Standard Template Library (STL)
uses a Red-Black tree for their Map
STL in C++ is like Collections in Java
Implementing Map interface
with a Binary Search Tree (BST)
The
next few slides will explore your
intuitions (guesses) about how to place
(key, value) pairs into a Binary Search Tree
in a way that makes sense for
implementing Map
The examples list (key, value) pairs in
parentheses like this: (“Mike”, “Clancy”)
So this is a dictionary that lets you find
somebody’s last name if all you know is their
first name
What does this tree map look like
after we put ("Leonard", "Wei")?
(A)
(C)
(B)
(D)
What does this tree map look like
after we put ("Paul", "Kube")?
(B)
(A)
(C)
(D)
What does this tree map look like
after we put ("Maria", "Clancy")?
(A)
(C)
(B)
(D)
Hash Tables (HashMaps)
Implementing the Map interface with Hash Tables
Imagine you want to look up your
neighbors’ names, based on their house
number
House
numbers: 2555 through 10567
(roughly 4000 houses)
Names: one last name per house
Array vs Tree
You
could store them in a balanced TreeMap
of some kind
Log(n) to do get, put, delete
Or
you could store them in an array
Array is really fast lookup! O(1)
Just look in myarray[housenumber] to get the
name
Hash Table is just a modified,
more flexible array
Keys
don’t have to be integers 0-(size-1)
(Ideally) avoids big gaps like our gap from
0 to 2555 in the house numbers
Hash
work:
function is what at makes this all
Hash key collisions
Hash
function takes key and maps it to an
integer
Sometimes will map two DIFFERENT keys to
the same integer
“Collision”
We
can NOT overwrite the value the way
we would if it really were the same key
Need a way of storing multiple values in a
given “place” in the hash table
Closed Addressing with Linear
Probing
Where
does
“Annie” go if
hashkey(“Annie”)
= 3?
A. 0
B. 1
C. 2
D. 3
E. Other
Array index
0
1
2
3
4
5
6
7
8
Value
Closed Addressing with Linear
Probing
A.
B.
C.
D.
E.
Where does “Juan”
go if
hashkey(“Juan”) =
4?
1
2
3
4
Other
Array index
Value
0
1
2
3
4
5
6
7
8
Annie
Closed Addressing with Linear
Probing
Where
does
“Julian” go if
hashkey(“Julian”)
= 3?
A. 1
B. 2
C. 3
D. 4
E. Other
Array index
Value
0
1
2
3
Annie
4
Juan
5
6
7
8
Closed Addressing with Linear
Probing
Where
does
“Solange” go if
hashkey(“Solange
”) = 5?
A. 3
B. 4
C. 5
D. 6
E. Other
Array index
Value
0
1
2
3
Annie
4
Juan
5
Julian
6
7
8