170 likes | 328 Views
Data Structures. Hash Table. Consider storing data for 100 employees by their Social Security Numbers (SSN) SSN range: 000000000 – 999999999 A fast search: SSN is index of an array E.g. myItem is at position 123456789 myItem = myArray [123456789] Characteristics
E N D
Data Structures Hash Table
Consider storing data for 100 employees by their Social Security Numbers (SSN) • SSN range: 000000000 – 999999999 • A fast search: SSN is index of an array • E.g. • myItem is at position 123456789 • myItem = myArray[123456789] • Characteristics • Good--Efficiency of O(1) • Bad-- Requires array of size 109, most of which is unoccupied • Can we have something that • Has efficiency of nearly O(1) and • Requires reasonable amount of space Why Hash Table?
Keys (e.g., SSN) are “hashed” (mish-mashed) to another number, which can be used as index for a smaller array. E.g., • item1 key: 1234568989 myArray[89] = item1 • Item2 key: 1234567575 myArray[75] = item2 • Item3 key: 3457892121 myArray[21] = item3 • Item4 key: 9234572121 myArray[?] = item4 • Last 2 cases: collision, when two keys hash to the same hash value Hashing
item1: 1234568989 item2: 1234567575 item3: 3457892121 item4: 9234572121 Item5: 7854387575 Item6: 5432192424 Item7: 3311222020 Resolving Collisions (Chaining) Key Hashed Index Data myTable 0 Ω 1 Ω … Ω 20 item7 21 item4 Ω item3 23 Ω item6 24 Ω … … Ω 75 item2 item5 76 Ω … 89 item1 Ω
item1: 1234568989 item2: 1234567575 item3: 3457892121 item4: 9234572121 Item5: 7854387575 Item6: 5432192424 Item7: 3311222020 Resolving Collisions (Open Hashing) Key Hashed Index Data myTable 0 -1 1 -1 … 20 Item 7 21 Item3 Item4 22 23 -1 24 Item 6 … Item 2 75 76 Item 5 … 89 Item 1
Given names as keys: • amy • tammy • frank • billy • Convert keys to array indices. • Max size of array: 10 • name(hashF1) integer (hashF2) index • E.g., • amyAscii(a) + Ascii(m) + Ascii(y) • = 97 + 109 + 121 = 327 327 % 10 = 7 • tammyAscii(t) + Ascii(a) + Ascii(m) + Ascii(m) + Ascii(y) = 116 + 97 + 109 + 109 + 121 = 552 552 % 10 = 2 Hashing Non-integer Keys myTable 0 Ω 1 Ω Ω 2 tammy … 6 Ω amy 7 Ω 8 Ω … Ω 10 …
Given: key = 1234567 • h(key) = key % 100 • 1234567 67 • 3785421 21 • Given: key = beth • h1(key) = ascii(b) + ascii(e) + ascii(t) + ascii(h) = 98 + 121 + 116 + 104 = 419 • h2(419) = 415 % 100 = 19 • h(key) = h2(h1(key)) = 19 • Thus, “beth” -> 19 A Simple hash function
void insert (elemType &item); • Inserts item in the table, • bool remove (keyType key); • Removes data item corresponding to key. Returns true when successful; false, otherwise. • bool search (keyType key); • Searches the table for item corresponding to key. Returns true when match found; false, otherwise. • elemType search(keyType key); • Searches and return the value corresponding to key • book isEmpty(); • void clear(); ADT Hash Table
bool search (keyType key); • hash(key) anIndex T(n) = c1 • IF array[anIndex] is not empty THEN T(n) = c2 + c3 search the linked listELSE value is not presentEND IF • return true/false T(n) = c4 • T(n) = c1 + c2 + c3 + c4O(1) almost Growth Rate (efficiency) of Hash Table operations
Describe the data structure to represent a hash table Write a C++ code for the structure, to be included in the private section of the (hash) Table class. Your Turn
Hash table data structure Ω 0 Array Struct 1 Ω 2 Ω Ω 3 4 Ω Ω 5 Ω 6 7 Ω Ω 8 9 Ω
To represent a group of data elements of differenttypesas a single unit Contrast this with an array, whose elements must of the sametype. Is like a class, but every part is public by default. No operations is a struct. Struct
Definition: struct athlete_t { string name; int weight; // in kg int height; // in cm}; STRUCT (Example) Usage: athlete_t ath; ath.name = “John”;ath.weight = 200;ath.height = 190; cout << ath.name << endl;cout << ath.weight << endl;cout << ath.height << endl; athlete_t team[MAX]; team[0] = ath;
Data structure for Hash table private: struct nodeType { elemType data; nodeType *next; }; static const int MAX = 10; nodeType* list[MAX]; };
ADT (Hash) table class Table { public: Table(); void insert(elemType item); bool remove(keyType key); bool retrieve(keyType key, elemType &item); void clear(); void print(); private: ... };
Constructor • What needs to be done in the constructor? • Write a C++ code to implement Table(). • Insert • What are the steps necessary to insert an item into the Hash table? • Write a C++ code to implement insert(elemType item) in the Table class. Your turn