Lecture 11 CS 2013 1.

Slides:



Advertisements
Similar presentations
© 2004 Goodrich, Tamassia Hash Tables
Advertisements

© 2004 Goodrich, Tamassia Hash Tables
Hashing as a Dictionary Implementation
© 2004 Goodrich, Tamassia Hash Tables1  
Chapter 9: Maps, Dictionaries, Hashing Nancy Amato Parasol Lab, Dept. CSE, Texas A&M University Acknowledgement: These slides are adapted from slides provided.
Maps. Hash Tables. Dictionaries. 2 CPSC 3200 University of Tennessee at Chattanooga – Summer 2013 © 2010 Goodrich, Tamassia.
Data Structures Lecture 12 Fang Yu Department of Management Information Systems National Chengchi University Fall 2010.
CSC401 – Analysis of Algorithms Lecture Notes 5 Heaps and Hash Tables Objectives: Introduce Heaps, Heap-sorting, and Heap- construction Analyze the performance.
Dictionaries and Hash Tables1  
Sets and Maps Chapter 9. Chapter 9: Sets and Maps2 Chapter Objectives To understand the Java Map and Set interfaces and how to use them To learn about.
Hash Tables1 Part E Hash Tables  
Hash Tables1 Part E Hash Tables  
Hash Tables1 Part E Hash Tables  
Dictionaries 4/17/2017 3:23 PM Hash Tables  
Maps, Hash Tables and Dictionaries Chapter 10.1, 10.2, 10.3, 10.5.
Maps, Dictionaries, Hashing
CS 221 Analysis of Algorithms Data Structures Dictionaries, Hash Tables, Ordered Dictionary and Binary Search Trees.
CS212: DATA STRUCTURES Lecture 10:Hashing 1. Outline 2  Map Abstract Data type  Map Abstract Data type methods  What is hash  Hash tables  Bucket.
Hash Tables1   © 2010 Goodrich, Tamassia.
Dictionaries and Hash Tables1 Hash Tables  
Maps, Hash Tables, Skip Lists, Sets last Update: Nov 4, 2014 EECS2011: Maps, Hash Tables, Skip Lists, Sets1.
© 2004 Goodrich, Tamassia Hash Tables1  
CHAPTER 9 HASH TABLES, MAPS, AND SKIP LISTS ACKNOWLEDGEMENT: THESE SLIDES ARE ADAPTED FROM SLIDES PROVIDED WITH DATA STRUCTURES AND ALGORITHMS IN C++,
Sets and Maps Chapter 9. Chapter Objectives  To understand the Java Map and Set interfaces and how to use them  To learn about hash coding and its use.
Maps1 © 2010 Goodrich, Tamassia. Maps2  A map models a searchable collection of key-value entries  The main operations of a map are for searching, inserting,
Lecture14: Hashing Bohyung Han CSE, POSTECH CSED233: Data Structures (2014F)
Hash Maps Rem Collier Room A1.02 School of Computer Science and Informatics University College Dublin, Ireland.
Algorithms Design Fall 2016 Week 6 Hash Collusion Algorithms and Binary Search Trees.
CS203 Lecture 14. Hashing An object may contain an arbitrary amount of data, and searching a data structure that contains many large objects is expensive.
Sets and Maps Chapter 9.
Hash Tables 1/28/2018 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M.
Maps 1/28/2018 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H. Goldwasser,
Hashing (part 2) CSE 2011 Winter March 2018.
CSCI 210 Data Structures and Algorithms
Hashing CSE 2011 Winter July 2018.
Dictionaries and Hash Tables
Dictionaries Dictionaries 07/27/16 16:46 07/27/16 16:46 Hash Tables 
© 2013 Goodrich, Tamassia, Goldwasser
Dictionaries 9/14/ :35 AM Hash Tables   4
Hash Tables 3/25/15 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M.
Searching.
Data Structures and Database Applications Hashing and Hashtables in C#
Dictionaries < > = Dictionaries Dictionaries
Data Structures Maps and Hash.
Data Structures and Database Applications Hashing and Hashtables in C#
Hash Tables 11/22/2018 3:15 AM Hash Tables  1 2  3  4
Dictionaries 11/23/2018 5:34 PM Hash Tables   Hash Tables.
Dictionaries and Hash Tables
Copyright © Aiman Hanna All rights reserved
Maps.
Hash Tables   Maps Dictionaries 12/7/2018 5:58 AM Hash Tables  
CH 9.2 : Hash Tables Acknowledgement: These slides are adapted from slides provided with Data Structures and Algorithms in C++, Goodrich, Tamassia and.
Ordered Maps & Dictionaries
Dictionaries and Hash Tables
Copyright © Aiman Hanna All rights reserved
1 Lecture 10 CS2013.
"He's off the map!" - Eternal Sunshine of the Spotless Mind
Dictionaries 1/17/2019 7:55 AM Hash Tables   4
CH 9.2 : Hash Tables Acknowledgement: These slides are adapted from slides provided with Data Structures and Algorithms in C++, Goodrich, Tamassia and.
Hash Tables Computer Science and Engineering
Hash Tables Computer Science and Engineering
Hashing Sections 10.2 – 10.3 Lecture 26 CS302 Data Structures
Hash Tables Computer Science and Engineering
Sets and Maps Chapter 9.
Dictionaries 4/5/2019 1:49 AM Hash Tables  
Maps 4/25/2019 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H. Goldwasser,
CS210- Lecture 17 July 12, 2005 Agenda Collision Handling
CS210- Lecture 16 July 11, 2005 Agenda Maps and Dictionaries Map ADT
Dictionaries < > = Dictionaries Dictionaries
Dictionaries and Hash Tables
Presentation transcript:

Lecture 11 CS 2013 1

2 Maps A List or array can be thought of as a set of key-value pairs in which the keys are integers (the indexes) and the values are the data being stored. Suppose we want to be able to look up values using a key other than an integer index. For example, we need to look up friends' addresses based on their names. We could write a class with instance variables for name and address and then construct a List or Set. When we need to look up an address, we iterate through the list looking for a match for the name of the person whose address we want to look up. Maps provide a simpler alternative by mapping keys of any type to values of any other type.

Maps A map models a searchable collection of key- value entries The main operations of a map are for searching, inserting, and deleting items Multiple entries with the same key are not allowed Applications: address book student-record database © 2014 Goodrich, Tamassia, Goldwasser Maps 3

The Map ADT © 2014 Goodrich, Tamassia, Goldwasser Maps 4 get(k): if the map M has an entry with key k, return its associated value; else, return null put(k, v): insert entry (k, v) into the map M; if key k is not already in M, then return null; else, return old value associated with k remove(k): if the map M has an entry with key k, remove it from M and return its associated value; else, return null size(), isEmpty() entrySet(): return an iterable collection of the entries in M keySet(): return an iterable collection of the keys in M values(): return an iterator of the values in M © 2014 Goodrich, Tamassia, Goldwasser Maps 4

Example Operation Output Map isEmpty() true Ø put(5,A) null (5,A) put(7,B) null (5,A),(7,B) put(2,C) null (5,A),(7,B),(2,C) put(8,D) null (5,A),(7,B),(2,C),(8,D) put(2,E) C (5,A),(7,B),(2,E),(8,D) get(7) B (5,A),(7,B),(2,E),(8,D) get(4) null (5,A),(7,B),(2,E),(8,D) get(2) E (5,A),(7,B),(2,E),(8,D) size() 4 (5,A),(7,B),(2,E),(8,D) remove(5) A (7,B),(2,E),(8,D) remove(2) E (7,B),(8,D) get(2) null (7,B),(8,D) isEmpty() false (7,B),(8,D) © 2014 Goodrich, Tamassia, Goldwasser Maps 5

A Simple List-Based Map We can implement a map using an unsorted list We store the items of the map in a list S (based on a doublylinked list), in arbitrary order trailer header nodes/positions entries 9 c 6 5 8 © 2014 Goodrich, Tamassia, Goldwasser Maps 6

The get(k) Algorithm Algorithm get(k): B = S.positions() {B is an iterator of the positions in S} while B.hasNext() do p = B.next() { the next position in B } if p.element().getKey() = k then return p.element().getValue() return null {there is no entry with key equal to k} © 2014 Goodrich, Tamassia, Goldwasser Maps 7

The put(k,v) Algorithm Algorithm put(k,v): B = S.positions() while B.hasNext() do p = B.next() if p.element().getKey() = k then t = p.element().getValue() S.set(p,(k,v)) return t {return the old value} S.addLast((k,v)) n = n + 1 {increment variable storing number of entries} return null { there was no entry with key equal to k } © 2014 Goodrich, Tamassia, Goldwasser Maps 8

The remove(k) Algorithm Algorithm remove(k): B =S.positions() while B.hasNext() do p = B.next() if p.element().getKey() = k then t = p.element().getValue() S.remove(p) n = n – 1 {decrement number of entries} return t {return the removed value} return null {there is no entry with key equal to k} © 2014 Goodrich, Tamassia, Goldwasser Maps 9

Performance of a List-Based Map put takes O(1) time since we can insert the new item at the beginning or at the end of the sequence get and remove take O(n) time since in the worst case (the item is not found) we traverse the entire sequence to look for an item with the given key The unsorted list implementation is effective only for maps of small size or for maps in which puts are the most common operations, while searches and removals are rarely performed (e.g., historical record of logins to a workstation) © 2014 Goodrich, Tamassia, Goldwasser Maps 10

Intuitive Notion of a Map Intuitively, a map M supports the abstraction of using keys as indices with a syntax such as M[k]. Consider a restricted setting in which a map with n items uses keys that are known to be integers in a range from 0 to N − 1, for some N ≥ n. © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 11

12 Hashing An object may contain an arbitrary amount of data, and searching a data structure that contains many large objects can be expensive suppose your set of Strings stores the text of various books, you are adding a book, and you need to make sure you are preserving the Set definition – ie that no book already in the Set has the same text as the one you are adding. A hash function maps each datum to a value of a fixed size. This reduces the search space and makes searching less expensive Hash functions must be deterministic, since when we search for an item we will search for its hashed value. If an identical item is in the list, it must have received the same hash value

Hashing What should we do if our keys are not integers in the range from 0 to N – 1? Use a hash function to map general keys to corresponding indices in a table. For instance, the last four digits of a Social Security number.  1 025-612-0001 2 981-101-0002 3  4 451-229-0004 … © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 13

14 Hashing Hash functions often use the data to calculate some numeric value, then perform a modulo operation. This results in a bounded-length hash value. If the calculation ends in % n, the maximum hash value is n-1, no matter how large the original data is. It also tends to produce hash values that are relatively uniformly distributed, minimizing collisions. Many hash-based data structures apply a compression function with a second modulo operation to scale the hash codes to a desired size and to resize the map (ie create new, different-sized array) when desired to either save space or reduce collisions Read the book’s descriptions of various ways to create hash functions; the only details that are important now are that Hash functions usually involve one or two modulo operations for scaling Hash functions are designed to disperse the hash codes in a way that appears random in order to avoid collisions

Hash Functions and Hash Tables A hash function h maps keys of a given type to integers in a fixed interval [0, N - 1] Example: h(x) = x mod N is a hash function for integer keys The integer h(x) is called the hash value of key x A hash table for a given key type consists of Hash function h Array (called table) of size N When implementing a map with a hash table, the goal is to store item (k, o) at index i = h(k) © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 15

Example We design a hash table for a map storing entries as (SSN, Name), where SSN (social security number) is a nine-digit positive integer Our hash table uses an array of size N = 10,000 and the hash function h(x) = last four digits of x  1 2 3 4 9997 9998 9999 … 451-229-0004 981-101-0002 200-751-9998 025-612-0001 © 2014 Goodrich, Tamassia, Goldwasser Hash Tables 16

Hash Functions A hash function is usually specified as the composition of two functions: Hash code: h1: keys  integers Compression function: h2: integers  [0, N - 1] The hash code is applied first, and the compression function is applied next on the result, i.e., h(x) = h2(h1(x)) The goal of the hash function is to “disperse” the keys in an apparently random way © 2014 Goodrich, Tamassia, Goldwasser Hash Tables 17

Hash Codes Component sum: Memory address: We reinterpret the memory address of the key object as an integer (default hash code of all Java objects) Problem: we need objects that are equal to have the same hash code Integer cast: We reinterpret the bits of the key as an integer Suitable for keys of length less than or equal to the number of bits of the integer type (e.g., byte, short, int and float in Java) Component sum: We partition the bits of the key into components of fixed length (e.g., 16 or 32 bits) and we sum the components (ignoring overflows) Suitable for numeric keys of fixed length greater than or equal to the number of bits of the integer type (e.g., long and double in Java) © 2014 Goodrich, Tamassia, Goldwasser Hash Tables 18

Hash Codes (cont.) Polynomial accumulation: We partition the bits of the key into a sequence of components of fixed length (e.g., 8, 16 or 32 bits) a0 a1 … an-1{ We evaluate the polynomial p(z) = a0 + a1 z + a2 z2 + … … + an-1zn-1 at a fixed value z, ignoring overflows Especially suitable for strings (e.g., the choice z = 33 gives at most 6 collisions on a set of 50,000 English words) © 2014 Goodrich, Tamassia, Goldwasser Hash Tables 19

Compression Functions Division: h2 (y) = y mod N The size N of the hash table is usually chosen to be a prime The reason has to do with number theory and is beyond the scope of this course © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 20

Compression Functions Multiply, Add and Divide (MAD): h2 (y) = (ay + b) mod N a and b are nonnegative integers such that a mod N  0 Otherwise, every integer would map to the same value b © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 21

Abstract Hash Map in Java © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 22

Abstract Hash Map in Java, 2 © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 23

Collision Handling Collisions occur when different elements are mapped to the same cell Separate Chaining: let each cell in the table point to a linked list of entries that map there  1 2 3 4 451-229-0004 981-101-0004 025-612-0001 Separate chaining is simple, but requires additional memory outside the table © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 24

Map with Separate Chaining Delegate operations to a list-based map at each cell: Algorithm get(k): return A[h(k)].get(k) Algorithm put(k,v): t = A[h(k)].put(k,v) if t = null then {k is a new key} n = n + 1 return t Algorithm remove(k): t = A[h(k)].remove(k) if t ≠ null then {k was found} n = n - 1 © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 25

Hash Table with Chaining © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 26

Hash Table with Chaining, 2 © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 27

Linear Probing Example: h(x) = x mod 13 Open addressing: the colliding item is placed in a different cell of the table Linear probing: handles collisions by placing the colliding item in the next (circularly) available table cell Each table cell inspected is referred to as a “probe” Colliding items lump together, causing future collisions to cause a longer sequence of probes Example: h(x) = x mod 13 Insert keys 18, 41, 22, 44, 59, 32, 31, 73, in this order 1 2 3 4 5 6 7 8 9 10 11 12 41 18 44 59 32 22 31 73 1 2 3 4 5 6 7 8 9 10 11 12 © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 28

Search with Linear Probing Consider a hash table A that uses linear probing get(k) We start at cell h(k) We probe consecutive locations until one of the following occurs An item with key k is found, or An empty cell is found, or N cells have been unsuccessfully probed Algorithm get(k) i  h(k) p  0 repeat c  A[i] if c =  return null else if c.getKey () = k return c.getValue() else i  (i + 1) mod N p  p + 1 // # cells probed until p = N return null © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 29

Updates with Linear Probing To handle insertions and deletions, we introduce a special object, called DEFUNCT, which replaces deleted elements. This prevents searches from terminating with null entries that affected where previous entries were placed remove(k) We search for an entry with key k If such an entry (k, o) is found, we replace it with the special item DEFUNCT and we return element o Else, we return null put(k, o) We throw an exception if the table is full We start at cell h(k) We probe consecutive cells until one of the following occurs A cell i is found that is either empty or stores DEFUNCT, or N cells have been unsuccessfully probed We store (k, o) in cell i © 2014 Goodrich, Tamassia, Godlwasser Hash Tables 30

Hashing Performance of most hash table operations: 31 Hashing Performance of most hash table operations: O(1) if the keys are perfectly distributed (no collisions) O(n) in the worst case (all the hash codes turn out the same, so that in every case we search a bucket list (separate chaining) or do a linear probe (open addressing)

Performance of Hashing In the worst case, searches, insertions and removals on a hash table take O(n) time The worst case occurs when all the keys inserted into the map collide The load factor a = n/N affects the performance of a hash table Assuming that the hash values are like random numbers, it can be shown that the expected number of probes for an insertion with open addressing is 1 / (1 - a) The expected running time of all the dictionary ADT operations in a hash table is O(1) In practice, hashing is very fast provided the load factor is not close to 100% Applications of hash tables: small databases compilers browser caches Hash Tables 32

Hashing The more sparse the data, the more useful hashing is 33 Rural addresses: 1920 Quail Road 2113 Quail Road 3047 Quail Road 3310 Quail Road 4111 Quail Road Not Sparse: Juror numbers: Juror 1 Juror 2 Juror 3 Juror 4 Juror 5 Juror 6

34 HashMap and TreeMap The HashMap and TreeMap classes are two concrete implementations of the Map interface. HashMap is implemented with an underlying hash table and is efficient for locating a value, inserting a mapping, and deleting a mapping. TreeMap is implemented with a well-balanced Binary Search Tree (future week) and is efficient for traversing the keys in a sorted order.

35 HashMap Map<String, String> myDict = new HashMap<String, String>(); myDict.put("evacuate", "remove to a safe place"); myDict.put("descend", "move or fall downwards"); myDict.put("hypochondriac", "a person who is abnormally anxious about their health"); myDict.put("injunction", "an authoritative warning or order"); myDict.put("creek", "a stream, brook, or a minor tributary of a river"); myDict.put("googol", "10e100"); String defString = "The definition of "; System.out.println(defString + "descend : " + myDict.get("descend")); System.out.println(defString + "injunction : " + myDict.get("injunction")); System.out.println(defString + "googol : " + myDict.get("googol")); // http://www-inst.eecs.berkeley.edu/~cs61c/sp13/labs/06/

36 LinkedHashMap The entries in a HashMap are not ordered in a way that is typically useful to the programmer. LinkedHashMap extends HashMap with a linked list implementation that supports an ordering of the entries in the map. Entries in a LinkedHashMap can be retrieved in the order in which they were inserted into the map (known as the insertion order), or the order in which they were last accessed, from least recently accessed to most recently (access order). The no-arg constructor constructs a LinkedHashMap with the insertion order. LinkedHashMap<key type, value type>(initialCapacity, loadFactor, true).

Counting the Occurrences of Words in a Text 37 Counting the Occurrences of Words in a Text This program counts the occurrences of words in a text and displays the words and their occurrences in ascending alphabetical order. The program uses a hash map to store a pair consisting of a word and its count. Algorithm for handling input: For each word in the input file Remove non-letters (such as punctuation marks) from the word. If the word is already present in the frequencies map Increment the frequency for that entry. Else Insert an entry with frequency = 1 To sort the map, convert it to a tree map.   Source: Liang

38 package frequency; import java.io.File; import java.io.FileNotFoundException; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; public class WordFrequency { public static void main(String[] args) throws FileNotFoundException { Map<String, Integer> frequencies = new TreeMap<String, Integer>(); // in your labs, ask the user for the path to the input file; don’t hardcode it like this. Scanner in = new Scanner(new File("romeojuliet.txt")); while (in.hasNext()) { String word = clean(in.next()); // Get the old frequency count if (word != "") { Integer count = frequencies.get(word); // If there was none, put 1; otherwise, increment the count if (count == null) { count = 1; } else { count = count + 1; } frequencies.put(word, count); // Print all words and counts for (String key : frequencies.keySet()) { System.out.println(key + ": " + frequencies.get(key));

39 /** * Removes non-letter characters from a String * * @param s * @return a string with all the letters from s */ public static String clean(String s) { String r = ""; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isLetter(c)) { r = r + c; } return r.toLowerCase();