cs 261 – data structuresweb.engr.oregonstate.edu/~sinisa/courses/osu/cs261... · hash tables:...
TRANSCRIPT
![Page 1: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/1.jpg)
CS 261 – Data Structures
Hash TablesBuckets/Chaining
1
![Page 2: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/2.jpg)
A linked list or other ADT (e.g., AVL tree) at each element of the hash table
0 Angie Robert1 Linda2 Joe Max John Joy34 Abigail Mark
Resolving Collisions: Chaining / Buckets
2
![Page 3: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/3.jpg)
Hash Tables: Algorithmic Complexity• Assumptions:
–Time to compute hash function is constant–Chaining uses a linked list–Worst case à All keys hash to the same position
–Best case à Hash function uniformly distributes the values (all buckets have the same number of objects in them)
3
![Page 4: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/4.jpg)
Hash Tables: Algorithmic Complexity• Contains operation:
–Worst case for open addressing à O( n )–Worst case for chaining à O( n )
–Best case for open addressing à O( 1 )–Best case for chainingà O( 1 )
4
![Page 5: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/5.jpg)
Hash Table Size• Load factor:
λ = n / m
– For chaining, load factor can be greater than 1
• Want the load factor to remain small
• If load factor becomes larger than some threshold àdouble the table size
Load factor
# of elements
Size of table
5
![Page 6: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/6.jpg)
Hash Tables: Average Case• Assume hash function distributes elements uniformly
• Average complexity for remove, contains: O(𝜆)
• Want to keep the load factor relatively small
• Resize table –Only improves things IF hash function
distributes values uniformly
6
![Page 7: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/7.jpg)
Hash Table: Interface
•initHashTable
•addHashTable
•containsHashTable
•removeHashTable
7
![Page 8: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/8.jpg)
Hash Table: Implementation
struct HashTable {
struct Link **table; /* Array of Lists */
int count; /*number of elements in table*/
int tablesize; /* the number of lists */
};
8
![Page 9: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/9.jpg)
Hash Table: Implementation
struct Link {
struct DataElem elem;
struct Link * next;
};
struct DataElem {
TYPE_KEY key;
TYPE_VALUE value;
}
9
![Page 10: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/10.jpg)
Initializationvoid initHashTable(struct HashTable *ht, int size)
{
int index;
assert(ht);
ht->table = (struct Link **)
malloc(sizeof(struct Link *) * size);
assert(ht->table != 0);
...
Array of lists
Pointer to a list
10
![Page 11: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/11.jpg)
Initializationvoid initHashTable(struct HashTable *ht, int size)
{
...
ht->tablesize = size;
ht->count = 0;
for(index = 0; index < tablesize; index++)
ht->table[index] = 0; /* initList() */
}
NULL pointer
11
![Page 12: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/12.jpg)
Addvoid addHashTable (struct HashTable * ht,
struct DataElem elem) {
/* compute hash index to find the bucket */
int hash = HASH(elem.key);
int hashIndex =
(int) (labs(hash) % ht->tablesize);
...
returns long absolute integerExample:hashIndex = 4
12
![Page 13: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/13.jpg)
Addvoid addHashTable (struct HashTable * ht,
struct DataElem elem){
...
struct Link * newLink =
(struct Link *) malloc(sizeof(struct Link));
assert(newLink);
newLink->elem = elem;
...
0 Angie Robert1 Linda2 Joe Max John 34 Abigail Mark
Example:hashIndex = 4
newLink elem
13
![Page 14: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/14.jpg)
Addvoid addHashTable (struct HashTable * ht,
struct DataElem elem){
...
/* add to bucket */
newLink->next = ht->table[hashIndex];
ht->table[hashIndex] = newLink;
ht->count++;
...
}
next
0 Angie Robert1 Linda2 Joe Max John 34 Abigail Mark
Example:hashIndex = 4
newLink elem
14
![Page 15: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/15.jpg)
Addvoid addHashTable (struct HashTable * ht,
struct DataElem elem){
...
/* add to bucket */
newLink->next = ht->table[hashIndex];
ht->table[hashIndex] = newLink;
ht->count++;
...
}0 Angie Robert1 Linda2 Joe Max John 34 elem Abigail Mark
Example:hashIndex = 4
15
![Page 16: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/16.jpg)
Addvoid addHashTable (struct HashTable * ht,
struct DataElem elem){
...
/* resize if necessary */
float loadFactor = ht->count/ ht->tableSize;
if ( loadFactor > MAX_LOAD_FACTOR )
_resizeTable(ht);
}
16
![Page 17: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/17.jpg)
_resizeTablevoid _resizeTable(struct HashTable *ht) {
int oldsize = ht->tablesize;
struct HashTable *oldht = ht;
struct Link *cur, *last;
int i;
/* New memory location */
initHashTable(ht, 2*oldsize);
...
17
![Page 18: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/18.jpg)
_resizeTablevoid _resizeTable(struct HashTable *ht) {
...
for( i = 0; i < oldsize; i++) {cur= oldht->table[i];while(cur != 0){...}
}/* Free old table */free(oldht);
}
18
![Page 19: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/19.jpg)
_resizeTablevoid _resizeTable(struct HashTable *ht) {
...
for( i = 0; i < oldsize; i++) {cur= oldht->table[i];while(cur != 0){
addHashTable(ht, cur->elem);last = cur;cur = cur->next;free(last);
}}free(oldht); /* Free up the old table */
}19
![Page 20: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/20.jpg)
Containsint containsHashTable(struct HashTable *ht,
struct DataElem elem)
{
int hash = HASH(elem.key);
int hashIndex = (int) (labs(hash) % ht->tablesize);
struct Link *cur;
cur = ht->table[hashIndex];/*go to the right bucket*/
...
Where to look for the element?
20
![Page 21: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/21.jpg)
Containsint containsHashTable(struct HashTable *ht,
struct DataElem elem)
{
...
cur= ht->table[hashIndex];
while(cur != 0){
if(EQ(cur->elem.value, elem.value)) return 1;
cur = cur->next;
}
return 0;
}
0 Angie Robert1 Linda2 Joe Max John
cur21
![Page 22: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/22.jpg)
Removevoid removeHashTable(struct HashTable *ht,
struct DataElem elem)
{
int hash = HASH(elem.key);
int hashIndex = (int) (labs(hash) % ht->tablesize);
struct Link *cur, *last;
...
Where to look for the element?
22
![Page 23: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/23.jpg)
Removevoid removeHashTable(struct HashTable *ht,
struct DataElem elem)
{ ...
cur = ht->table[hashIndex]; /* for iteration */
last = ht->table[hashIndex]; /* helps remove */
while(cur != 0){
if(EQ(cur->elem.value,elem.value)){
/* REMOVE */
}
else {
last = cur; /* remembers the previous link */
cur = cur->next; /* moves to the next link */
}
} ...
23
![Page 24: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/24.jpg)
Removevoid removeHashTable(struct HashTable *ht,
struct DataElem elem)
{ ...
if(EQ(cur->elem.value,elem.value)){
/* handle the special case !! */
if(cur == ht->table[hashIndex])
ht->table[hashIndex] = cur->next;
else
last->next = cur->next;
free(cur);
cur = 0; /*jump out of loop, if single remove*/
ht->count--;
}
else { ...
24
![Page 25: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/25.jpg)
When should you use hash tables?
• Data values must have good hash functions
• Need a guarantee that elements are
uniformly distributed
• Otherwise, a Skip List or AVL tree is often
faster
25
![Page 26: CS 261 – Data Structuresweb.engr.oregonstate.edu/~sinisa/courses/OSU/CS261... · Hash Tables: Algorithmic Complexity •Contains operation: –Worst case for open addressing à](https://reader033.vdocuments.net/reader033/viewer/2022050109/5f472c702be4ea31f15694e9/html5/thumbnails/26.jpg)
Your Turn• Worksheet 38: Hash Tables using Buckets
– Use linked list for buckets
– Keep track of number of elements
– Resize table if load factor is bigger than 8
• Questions??
26