From 0d8db9f45d6d8beb63e76d2272566f1811b0649e Mon Sep 17 00:00:00 2001 From: saad0105050 Date: Sun, 14 Sep 2014 04:08:16 -0400 Subject: [PATCH] Grouped files by data structures in the visual studio solution. Added the KeyOnly class that would behave like a KVPair, but `value' will be an alias of `key'. Overrode << operator for printing Singly/Doubly linked list, KVPair, KeyOnly, and HashTableBase. Completed testing of LinearProbingHashTable. Todo: Improve LinearProbingHashTable by storing values in the hashtable instead of pointers. Signed-off-by: saad0105050 --- YASI_12/YASI_12.vcxproj | 4 +- YASI_12/YASI_12.vcxproj.filters | 113 ++- YASI_12/ds.LinearProbingHashTable.h | 857 ++++++++++++++++++ YASI_12/ds.SeparateChainingHashTable.h | 352 +++++++ YASI_12/ds.doublylinkedlist.h | 13 + YASI_12/ds.hashtable.h | 750 --------------- YASI_12/ds.hashtablebase.h | 178 ++++ YASI_12/ds.kvpair.h | 44 + YASI_12/ds.list.h | 4 + YASI_12/ds.singlylinkedlist.h | 11 + YASI_12/main.cpp | 3 +- .../msvc/gtest/gtest.tlog/CL.read.1.tlog | Bin 37092 -> 37238 bytes gtest-1.7.0/msvc/gtest/vc120.idb | Bin 936960 -> 1313792 bytes gtest-1.7.0/msvc/gtestd.lib | Bin 3942632 -> 3942632 bytes 14 files changed, 1531 insertions(+), 798 deletions(-) create mode 100644 YASI_12/ds.LinearProbingHashTable.h create mode 100644 YASI_12/ds.SeparateChainingHashTable.h delete mode 100644 YASI_12/ds.hashtable.h create mode 100644 YASI_12/ds.hashtablebase.h diff --git a/YASI_12/YASI_12.vcxproj b/YASI_12/YASI_12.vcxproj index 514c1ee..89b6a9c 100644 --- a/YASI_12/YASI_12.vcxproj +++ b/YASI_12/YASI_12.vcxproj @@ -84,15 +84,17 @@ - + false + + diff --git a/YASI_12/YASI_12.vcxproj.filters b/YASI_12/YASI_12.vcxproj.filters index 7196712..03aea84 100644 --- a/YASI_12/YASI_12.vcxproj.filters +++ b/YASI_12/YASI_12.vcxproj.filters @@ -16,6 +16,21 @@ {e771e66c-6407-4d3a-bd6f-97ad63c60a2d} + + {dd3f1d18-aa29-4dd2-b39f-3fee286fb955} + + + {c53f92c4-0949-4c57-bebb-d65e28421697} + + + {7c28c024-2e52-4642-b5b0-dd1332b5e474} + + + {3513b12f-c68b-43a7-8531-76ebdb5b60f7} + + + {d2827f3c-736f-4f2a-891c-9fa2883e5685} + @@ -29,77 +44,83 @@ - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files + + Header Files\nonproject - - Header Files + + Header Files\List - Header Files + Header Files\List - - Header Files + + Header Files\Tree + + + Header Files\Tree - Header Files + Header Files\Tree - - Header Files + + Header Files\Tree - - Header Files + + Header Files\Tree + + + Header Files\Heap - Header Files + Header Files\Heap - - Header Files + + Header Files\List - - Header Files\nonproject + + Header Files\Dictionary - - Header Files + + Header Files\Dictionary - - Header Files + + Header Files\Common - - Header Files + + Header Files\Common - Header Files + Header Files\Common - - Header Files + + Header Files\Common + + + Header Files\Common - Header Files + Header Files\Common - - Header Files + + Header Files\Common + + + Header Files\Common - Header Files + Header Files\Common + + + Header Files\nonproject - - Header Files + + Header Files\Dictionary - - Header Files + + Header Files\Dictionary + + + Header Files\Dictionary \ No newline at end of file diff --git a/YASI_12/ds.LinearProbingHashTable.h b/YASI_12/ds.LinearProbingHashTable.h new file mode 100644 index 0000000..a4ed956 --- /dev/null +++ b/YASI_12/ds.LinearProbingHashTable.h @@ -0,0 +1,857 @@ +#pragma once +#include "common.h" +#include "ds.hashtablebase.h" +using namespace std; + +namespace yasi{ +namespace ds{ + + template< + class Key, + class Value = Key, + class EntryType = KeyOnly, // must have a public member `key' + class HashFunction = IntHashFunction, + class Pred = KVPairEqualityPredicate + > + class LinearProbingHashTable : public HashTableBase < + Key, + Value, + EntryType*, + HashFunction > { + ///////////////// enable testing /////////////////// + friend class LinearProbingHashTableTest; + public: + //typedef KVPair Pair; + typedef EntryType Pair; // technically, this pair may not have a value + typedef Pair* BucketType; + typedef Key KeyType; + typedef Value ValueType; + protected: + // flag about the usage of the first [0] slot + bool _zeroUsed; // true if an entry with key=0 exists + Value _zeroValue; + Pair _zeroPair; // the entry that was mapped to zero index + char* _pZeroKey; // all zeros up to #bytes of a Key; used to check if a Key is zero + + inline unsigned int circularNext(const int index) const{ + return modSize(index + 1); + } + inline unsigned int circularPrev(const int index) const{ + return modSize(index - 1); + } + inline bool isKeyZero(const Key* pKey) const{ + return memcmp(pKey, _pZeroKey, sizeof(Key)) == 0; + } + + // if a key is already there, it is updated + void insert(const Key& k, const Value& v){ + Pair* pair = insertKey(k); + if (pair && pair->value != v){ + pair->value = v; + } + else{ + // something is wrong, insertKey() failed + } + } + + // the key must be present in the table + + Pair* lookupKey(const Key& k) const { + // test the zero key + if (k == 0){ + if (_zeroUsed) return const_cast(&_zeroPair); + else return NULL; + } + else{ + // non-zero key + Pred keyEquals; + unsigned int firstBucket = index(k); + int cur = firstBucket; + do{ + Pair* pEntry = table[cur]; + + if (pEntry == NULL){ + // this slot must be empty + // because we started from the firstBucket, + // the key is not present in the table + return NULL; + } + else{ + // this slot is occupied; check key + if (keyEquals(k, pEntry->key)){ + // found match + return pEntry; + } + else{ + // move on to the next slot + cur = modSize(cur + 1); + } + } // + } while (cur != firstBucket); + // we checked all slots of the table; no match + return NULL; + } + } + + Pair* insertKey(const Key& k) { + + // insert/update the entry with hashcode 0 + if ( ((int)k) == 0){ + // key is zero + // we will use a special slot for this entry + if (_zeroUsed == false) + _zeroUsed = true; + _zeroPair.key = k; + _population++; + // see if we need to size up + if (needGrow(_population)) + grow(); + return &_zeroPair; + } + else{ + // key is non-zero + Pred keyEquals; + + // try all cells in the table, starting from the first (hashed) bucket + // if all cells are occupied, grow the table and keep trying + while (true){ + unsigned int firstBucket = index(k); + int cur = firstBucket; + do{ + Pair* pEntry = table[cur]; + + if (pEntry == NULL){ + // if this is the zero slot, we should skip it + // this slot must be empty, + // we can insert here + + // see if we need to size up after this insertion + if (needGrow(_population+1)){ + // current bucket is not appropriate anymore under new size + // exit the do{} loop, after which we grow and try again + continue; + } + else{ + pEntry = table[cur] = new Pair(k); + _population++; + return pEntry; + } + } + else{ + // this slot is occupied; check key + if (keyEquals(k, pEntry->key)){ + // found match + return pEntry; + } + else{ + // move on to the next slot + cur = modSize(cur + 1); + } + } // + } while (cur != firstBucket); + // we checked all slots of the table; no match + // try again after resizing + grow(); + } + return NULL; + } + } + + virtual void copyTable(BucketType* oldTable, const unsigned int oldSize) override { + // the zeroPair stays intact because it is determined by key, not hash value + // copy table elements + //BucketType* oldTable = (BucketType*)prevTable; + _population = _zeroUsed ? 1 : 0; + + for (unsigned int i = 0; i < oldSize; i++){ + Pair* p = oldTable[i]; + if (p){ + insert(p->key, p->value); + DELETE_SAFE(oldTable[i]); + } + } + // count the zero element + + } + + // forecefully provide a table (and associated state values) + // for test purpose only + void forceTable(BucketType* newTable, const unsigned int newLogSize, const unsigned int newPopulation, HashFunction& newHashFunction){ + clear(); + table = newTable; + _logSize = newLogSize; + _size = 1 << _logSize; + _population = newPopulation; + hash = newHashFunction; + } + void clear(){ + if (table){ + for (unsigned int i = 0; i < _size; i++){ + DELETE_SAFE(table[i]); + } + } + DELETE_ARR_SAFE(table); + _zeroUsed = false; + _size = _population = _logSize = 0; + } + public: + + LinearProbingHashTable(unsigned int logSize = INIT_LOGSIZE) : _zeroUsed(false), _zeroPair(0,0), HashTableBase(logSize){ + _pZeroKey = new char[sizeof(Key)]; + memset(_pZeroKey, 0, sizeof(Key)); + } + virtual ~LinearProbingHashTable(){ + clear(); + DELETE_SAFE(_pZeroKey); + } + virtual Value* get(const Key& key) const override { + Pair* kv = lookupKey(key); + if (kv) + return &(kv->value); + else + return NULL; + } + + virtual void put(const Key& key, const Value& value) override { return insert(key, value); } + virtual bool contains(const Key& key) const override { return lookupKey(key) == NULL; } + virtual void remove(const Key& k) override { + // zero key + if (k == 0){ + if (_zeroUsed) { + _zeroUsed = false; + _zeroPair.value = 0; + _population--; + if (needShrink(_population)) + shrink(); + } + } + else{ + // non-zero key + Pred keyEquals; + unsigned int curFirstBucket = index(k); + int cur = curFirstBucket; + const int searchStart = curFirstBucket; // remember our first posti + do{ + Pair* pEntry = table[cur]; + + if (pEntry == NULL){ + // this slot must be empty + // because we started from the firstBucket, + // the key is not present in the table + return; + } + else{ + // this slot is occupied; check key + if (keyEquals(k, pEntry->key)){ + // remove + DELETE_SAFE(table[cur]); + _population--; + if (needShrink(_population)) + shrink(); + else{ + // shuffle the entries from right to left until an empty slot is found + // (there must be one because we just deleted one) + // this will fix all other's linear probing sequence + const unsigned int startBucket = cur; + //bool crossedBoundary = false; // search crossed the table end and now at the beginning of the table due to mod operation + unsigned int neighbor = circularNext(cur); + while (neighbor != searchStart && // we have not checked all buckets + table[neighbor] != NULL )// there is an entry at the neighboring bucket and + { + //if (!crossedBoundary && neighbor < cur) { + // // our search just wrapped across the table boundary + // crossedBoundary = true; + //} + + unsigned int neighborFirstBucket = index(table[neighbor]->key); + if (neighborFirstBucket == neighbor || // is the neighbor at its own first bucket? then it should not move + ( + (curFirstBucket <= cur) // search did not wrap around the end + ? neighborFirstBucket > cur // skip if neighbor's first bucket to the right of cur + : neighborFirstBucket < cur // skip if neighbor's first bucket to the left of cur + ) + ) + { + // yes; skip it + neighbor = circularNext(neighbor); + } + else{ + // the (possibly distant) neighbor is not at its first bucket + + // move it to the left + table[cur] = table[neighbor]; + table[neighbor] = NULL; + // prepare for the next hop + cur = neighbor; + neighbor = circularNext(neighbor); + curFirstBucket = neighborFirstBucket; + } + } + } + // done + return; + } + else{ + // key didn't match + // move on to the next slot + cur = modSize(cur + 1); + } + } // table[cur] != NULL; go to next iteration of while loop + } while (cur != searchStart); + // we checked all slots of the table; no key match + // cannot remove; done + } + return; + } + + }; + + class LinearProbingHashTableTest : public yasi::Test{ + protected: + + template + class IdentityFunction : public IHashFunction{ + public: + virtual int operator()(Key n) const override{ + return n; + } + }; + template + class Mod8Function : public IHashFunction{ + public: + static const unsigned int modulus = 8; + virtual int operator()(Key n) const override{ + return n % 8; + } + }; + template + class Mod16Function : public IHashFunction{ + public: + static const unsigned int modulus = 16; + virtual int operator()(Key n) const override{ + return n % 16; + } + }; + template + class Mod32Function : public IHashFunction{ + public: + static const unsigned int modulus = 32; + virtual int operator()(Key n) const override{ + return n % 32; + } + }; + // mod 16 by default + template + class ModFunction : public IHashFunction{ + public: + unsigned int modulus; + ModFunction() : modulus(16){} + virtual int operator()(Key n) const override{ + return n % modulus; + } + }; + public: + void insert(){ + typedef LinearProbingHashTable, Mod16Function > IntHashTable; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::Pair Pair; + + IntHashTable h(4); + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(0, h.population()) << "pop not 0"; + + //int newLogSize = 4; // 16 entries + //int newSize = 1 << newLogSize; + //int newPopulation = 0; + //BucketType* newTable = new BucketType[newSize]; + //memset(newTable, 0, sizeof(BucketType*) * newSize); + //IdentityFunction newHashFunction; // maps n to n + //// put some entries into the new table + //newTable[4] = new Pair(4, 4); newPopulation++; + //newTable[5] = new Pair(5, 5); newPopulation++; + //newTable[6] = new Pair(6, 6); newPopulation++; + //// force these state into the hashtable + //h.forceTable(newTable, newLogSize, newPopulation, newHashFunction); + + { + SCOPED_TRACE("insert 4-5-6"); + h.insert(4, 4); + h.insert(5, 5); + h.insert(6, 6); + //// - - - - 4 5 6 - - - - - - - - - + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + cout << h; + ASSERT_EQ(3, h.population()) << "pop not 3"; + } + { + string str = "insert 20, which should go to bucket 7"; + int key = 20; + int bucket = 7; + SCOPED_TRACE(str); + Pair* p = h.insertKey(key); + p->value = key; // assign the value + cout << str << endl << h; + ASSERT_NE(0, (int)h.table[bucket]) << "bucket " << bucket << " NULL"; + ASSERT_EQ(p, h.table[bucket]) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->key) << key << " not in bucket " << bucket; + } + { + string str = "insert 23, which should go to bucket 8"; + int key = 23; + int bucket = 8; + SCOPED_TRACE(str); + Pair* p = h.insertKey(key); + p->value = key; // assign the value + cout << str << endl << h; + ASSERT_NE(0, (int)h.table[bucket]) << "bucket " << bucket << " NULL"; + ASSERT_EQ(p, h.table[bucket]) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->key) << key << " not in bucket " << bucket; + } + { + string str = "insert 20, which is already in bucket 7"; + SCOPED_TRACE(str); + int key = 20; + int bucket = 7; + SCOPED_TRACE(str); + Pair* p = h.insertKey(key); + cout << str << endl << h; + ASSERT_NE(0, (int)h.table[bucket]) << "bucket " << bucket << " NULL"; + ASSERT_EQ(p, h.table[bucket]) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->key) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->value) << key << " not in bucket " << bucket; + } + { + h.insert(13, 13); + h.insert(14, 14); + h.insert(15, 15); + // + string str = "search round the table; now insert 16, should go to bucket 0"; + int key = 16; + int bucket = 0; + SCOPED_TRACE(str); + Pair* p = h.insertKey(key); + p->value = key; // assign the value + cout << str << endl << h; + ASSERT_NE(0, (int)h.table[bucket]) << "bucket " << bucket << " NULL"; + ASSERT_EQ(p, h.table[bucket]) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->key) << key << " not in bucket " << bucket; + + } + { + string str = "search round the table; now insert 29, should go to bucket 1"; + int key = 29; + int bucket = 1; + SCOPED_TRACE(str); + Pair* p = h.insertKey(key); + p->value = key; // assign the value + cout << str << endl << h; + ASSERT_NE(0, (int)h.table[bucket]) << "bucket " << bucket << " NULL"; + ASSERT_EQ(p, h.table[bucket]) << key << " not in bucket " << bucket; + ASSERT_EQ(key, h.table[bucket]->key) << key << " not in bucket " << bucket; + + } + { + string str = "insert 0; should go to the zero element"; + int key = 0; + SCOPED_TRACE(str); + ASSERT_EQ(false, h._zeroUsed) << "_zeroUsed true"; + int prevPop = h.population(); + Pair* p = h.insertKey(key); + p->value = 100; // assign the value + cout << str << endl << h; + ASSERT_EQ(true, h._zeroUsed) << "_zeroUsed false"; + ASSERT_EQ(p, &h._zeroPair) << " zero key not in zeroPair"; + ASSERT_EQ(prevPop+1, h.population()) << "population did not increase"; + ASSERT_EQ(key, h._zeroPair.key) << key << " not in zeroPair"; + } + + } + + void copyTable(){ + typedef LinearProbingHashTable, ModFunction > IntHashTable; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::Pair Pair; + + IntHashTable h1(4), h2(5); + h1.hash.modulus = 16; + h2.hash.modulus = 32; + + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(0, h1.population()) << "h1 pop not 0"; + ASSERT_EQ(32, h2.size()) << "h2 size not 32"; + ASSERT_EQ(0, h2.population()) << "h2 pop not 0"; + + int h1MaxItemsWithoutGrow = (int)(h1.size() * h1.DENSITY_MAX) - 1; + // add some items to h1 without triggering grow() + int* pKeys = new int[h1MaxItemsWithoutGrow]; + srand((unsigned int)time(NULL)); + for (int i = 0; i < h1MaxItemsWithoutGrow; i++){ + pKeys[i] = rand(); + h1.insert(pKeys[i], pKeys[i]); + } + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(h1MaxItemsWithoutGrow, h1.population()) << "h1 pop not " << h1MaxItemsWithoutGrow; + + // now copy items from h1 to h2 + h2.copyTable(h1.table, h1.size()); + + // check that all items exist + // items are rehashed mod 32 + for (int i = 0; i < h1._size; i++){ + if (h1.table[i]){ + int key = h1.table[i]->key; + int value = h1.table[i]->value; + Pair* p = h2.lookupKey(key); + ASSERT_NE(0, (int)p) << "key " << key << " not found in h2"; + ASSERT_EQ(key, p->key) << "key " << key << " mismatch in h2 key " << p->key; + ASSERT_EQ(value, p->value) << "value " << value << " mismatch in h2 key " << p->key << "value: " << p->value; + } + } + + DELETE_ARR_SAFE(pKeys); + } + + void remove(){ + typedef LinearProbingHashTable, Mod16Function > IntHashTable; + typedef LinearProbingHashTable, Mod8Function > IntHashTable8; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::Pair Pair; + + IntHashTable h(4); + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(0, h.population()) << "pop not 0"; + + { + SCOPED_TRACE("insert 4-5-6-7"); + h.insert(4, 4); + h.insert(5, 5); + h.insert(6, 6); + h.insert(7, 7); + // add 12, and three more that map into 14 + h.insert(12, 12); + h.insert(14, 14); + h.insert(30, 30); + h.insert(46, 46); + //// 46 - - - 4 5 6 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + cout << h; + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(8, h.population()) << "population not 8"; + + } + { + SCOPED_TRACE("remove 4"); + h.remove(4); + //// 46 - - - - 5 6 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + cout << h; + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(4)) << "key " << 4 << " not NULL"; + ASSERT_EQ(5, h.table[5]->key) << "[5] not " << 5; + ASSERT_EQ(6, h.table[6]->key) << "[6] not " << 6; + ASSERT_EQ(7, h.table[7]->key) << "[7] not " << 7; + ASSERT_EQ(7, h.population()) << "population not 7"; + } + { + SCOPED_TRACE("remove 6"); + cout << "before removing 6\n" << h; + h.remove(6); + //// 46 - - - - 5 - 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(6, h.population()) << "population not 6"; + cout << "after removing 6\n" << h; + ASSERT_EQ(NULL, (int)h.lookupKey(6)) << "key " << 6 << " not NULL"; + ASSERT_EQ(5, h.table[5]->key) << "key " << 5 << " misplaced"; + ASSERT_EQ(7, h.table[7]->key) << "key " << 7 << " misplaced"; + } + { + SCOPED_TRACE("remove simple 2-item bucket"); + h.insert(85, 85); + //// 46 - - - - 5 85 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(7, h.population()) << "population not 7"; + ASSERT_EQ(85, h.table[6]->key) << "[6] not 85"; + ASSERT_EQ(16, h.size()) << "size not 16"; + h.remove(5); + //// 46 - - - - 85 - 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(NULL, (int)h.lookupKey(5)) << "key " << 5 << " not NULL"; + ASSERT_EQ(85, h.table[5]->key) << "key " << 85 << " misplaced"; + ASSERT_EQ(NULL, (int)h.table[6]) << "[6] not NULL"; + ASSERT_EQ(7, h.table[7]->key) << "key " << 7 << " misplaced"; + + // put 5 back + h.insert(5,5); + //// 46 - - - - 85 5 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(5, h.table[6]->key) << "key " << 5 << " misplaced"; + + // delete 5 + h.remove(5); + //// 46 - - - - 85 - 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(5)) << "key " << 5 << " not NULL"; + ASSERT_EQ(85, h.table[5]->key) << "key " << 85 << " misplaced"; + ASSERT_EQ(NULL, (int)h.table[6]) << "[6] not NULL"; + ASSERT_EQ(7, h.table[7]->key) << "key " << 7 << " misplaced"; + + // for consistency later on, replace 85 with 5 + h.remove(85); + h.insert(5, 5); + //// 46 - - - - 5 - 7 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(5, h.table[5]->key) << "[5] not 5"; + ASSERT_EQ(NULL, (int)h.table[6]) << "[6] not NULL"; + ASSERT_EQ(7, h.table[7]->key) << "key " << 7 << " misplaced"; + } + + // add several entries that map into bucket 5 + h.insert(21, 21); + h.insert(37, 37); + h.insert(53, 53); + //// 46 - - - - 5 21 7 37 53 - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + + // add several entries that map into bucket 7 + h.insert(23, 23); + h.insert(39, 39); + //// 46 - - - - 5 21 7 37 53 23 39 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + + { + SCOPED_TRACE("remove key from multi-item bucket"); + + { + SCOPED_TRACE("remove 5"); + //// 46 - - - - 5 21 7 37 53 23 39 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // delete 5 + cout << "before removing 5:\n" << h << endl; + h.remove(5); + //// 46 - - - - 21 37 7 53 23 39 - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + cout << "after removing 5:\n" << h << endl; + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(5)) << "key " << 5 << " not NULL"; + ASSERT_EQ(21, h.table[5]->key) << "[5] not 21"; + ASSERT_EQ(37, h.table[6]->key) << "[6] not 37"; + ASSERT_EQ(7, h.table[7]->key) << "[7] not 7"; + ASSERT_EQ(53, h.table[8]->key) << "[8] not 53"; + ASSERT_EQ(23, h.table[9]->key) << "[9] not 23"; + ASSERT_EQ(39, h.table[10]->key) << "[10] not 39"; + ASSERT_EQ(NULL, (int)h.table[11]) << "[11] not NULL"; + ASSERT_EQ(12, h.table[12]->key) << "[12] not 12"; + ASSERT_EQ(NULL, (int)h.table[13]) << "[13] not NULL"; + ASSERT_EQ(14, h.table[14]->key) << "[14] not 14"; + } + { + SCOPED_TRACE("remove 21"); + //delete 21 + h.remove(21); + //// 46 - - - - 37 53 7 23 39 - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(21)) << "key " << 21 << " not NULL"; + ASSERT_EQ(37, h.table[5]->key) << "[5] not 37"; + ASSERT_EQ(53, h.table[6]->key) << "[6] not 53"; + ASSERT_EQ(7, h.table[7]->key) << "[7] not 7"; + ASSERT_EQ(23, h.table[8]->key) << "[8] not 23"; + ASSERT_EQ(39, h.table[9]->key) << "[9] not 39"; + ASSERT_EQ(NULL, (int)h.table[10]) << "[10] not NULL"; + ASSERT_EQ(NULL, (int)h.table[11]) << "[11] not NULL"; + ASSERT_EQ(12, h.table[12]->key) << "[12] not 12"; + ASSERT_EQ(NULL, (int)h.table[13]) << "[13] not NULL"; + ASSERT_EQ(14, h.table[14]->key) << "[14] not 14"; + } + + { + SCOPED_TRACE("remove 23"); + //delete 23 + h.remove(23); + //// 46 - - - - 37 53 7 39 - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(23)) << "key " << 23 << " not NULL"; + ASSERT_EQ(37, h.table[5]->key) << "[5] not 37"; + ASSERT_EQ(53, h.table[6]->key) << "[6] not 53"; + ASSERT_EQ(7, h.table[7]->key) << "[7] not 7"; + ASSERT_EQ(39, h.table[8]->key) << "[8] not 39"; + ASSERT_EQ(NULL, (int)h.table[9]) << "[9] not NULL"; + ASSERT_EQ(NULL, (int)h.table[10]) << "[10] not NULL"; + ASSERT_EQ(NULL, (int)h.table[11]) << "[11] not NULL"; + ASSERT_EQ(12, h.table[12]->key) << "[12] not 12"; + ASSERT_EQ(NULL, (int)h.table[13]) << "[13] not NULL"; + ASSERT_EQ(14, h.table[14]->key) << "[14] not 14"; + } + h.insert(62, 62); + h.insert(17, 17); + //// 46 62 17 - - 37 53 39 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(62, h.table[1]->key) << "[1] not 62"; + + { + SCOPED_TRACE("remove 46"); + //delete 46 + cout << "before removing 46:\n" << h << endl; + h.remove(46); + //// 62 17 - - - 37 53 39 - - - - 12 - 14 30 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + cout << "after removing 46:\n" << h << endl; + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(46)) << "key " << 46 << " not NULL"; + ASSERT_EQ(62, h.table[0]->key) << "[0] not 62"; + ASSERT_EQ(17, h.table[1]->key) << "[1] not 17"; + ASSERT_EQ(NULL, (int)h.table[2]) << "[2] not NULL"; + ASSERT_EQ(14, h.table[14]->key) << "[14] not 14"; + ASSERT_EQ(30, h.table[15]->key) << "[15] not 30"; + } + + { + SCOPED_TRACE("remove 30"); + //delete 30 + h.remove(30); + //// - 17 - - - 37 53 39 - - - - 12 - 14 62 + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(30)) << "key " << 30 << " not NULL"; + ASSERT_EQ(17, h.table[1]->key) << "[1] not 17"; + ASSERT_EQ(NULL, (int)h.table[0]) << "[0] not NULL"; + ASSERT_EQ(14, h.table[14]->key) << "[14] not 14"; + ASSERT_EQ(62, h.table[15]->key) << "[15] not 62"; + } + { + SCOPED_TRACE("remove 14"); + //delete 14 + h.remove(14); + //// - - - - - 37 53 39 - - - - 12 - 62 - + //// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + ASSERT_EQ(16, h.size()) << "size not 16"; + ASSERT_EQ(NULL, (int)h.lookupKey(14)) << "key " << 14 << " not NULL"; + ASSERT_EQ(62, h.table[14]->key) << "[14] not 62"; + ASSERT_EQ(NULL, (int)h.table[15]) << "[15] not NULL"; + } + + } + { + SCOPED_TRACE("Zero key"); + ASSERT_EQ(false, h._zeroUsed) << "_zeroUsed true"; + h.insert(0, 5); + ASSERT_EQ(true, h._zeroUsed) << "_zeroUsed false"; + ASSERT_EQ(0, h._zeroPair.key) << "key of zero element non-zero"; + ASSERT_EQ(5, h._zeroPair.value) << "key of zero element non-zero"; + + // now delete 0 + h.remove(0); + ASSERT_EQ(false, h._zeroUsed) << "_zeroUsed true"; + ASSERT_EQ(0, h._zeroPair.key) << "key of zero element non-zero"; + ASSERT_EQ(0, h._zeroPair.value) << "value of zero element non-zero"; + } + { + SCOPED_TRACE("remove from an all-filled table"); + // create a pathological table + Pair** badTable = new Pair*[8]; // 8 entries in the table + for (int i = 0; i < 8; i++){ + badTable[i] = new Pair(5, i); // all keys are 5 + } + IntHashTable8 h2(3); // 8 elements to begin + h2.forceTable(badTable, 3, 8, h2.hash); // make the table full + ASSERT_EQ(8, h2.size()) << "size not 8"; + ASSERT_EQ(8, h2.population()) << "population not 8"; + ASSERT_EQ(8, h2.hash.modulus) << "has mod not 8"; + + { + SCOPED_TRACE("delete from index 5"); + cout << "before removing 5:\n" << h2; + h2.remove(5); + cout << "after removing 5:\n" << h2; + + ASSERT_EQ(7, h2.population()) << "population not 7"; + for (int i = 0; i < 8; i++){ + if (i == 4){ + ASSERT_EQ(NULL, (int)h2.table[i]) << "[" << i << "] not NULL"; + } + else + ASSERT_EQ(5, h2.table[i]->key) << "[" << i << "] not 5"; + } + } + + // cleanup + } + + } + + void growCondition(){ + typedef LinearProbingHashTable, ModFunction > IntHashTable; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::Pair Pair; + + IntHashTable h1(4); + h1.hash.modulus = 16; + + int i = 0; + { + SCOPED_TRACE("grow"); + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(0, h1.population()) << "h1 pop not " << 0; + int popLimit = h1.maxPopulationWithoutGrow(); + for (; i < popLimit; i++){ + h1.insert(i, i); + } + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(popLimit, h1.population()) << "h1 pop not " << popLimit; + cout << h1; + // this should trigger grow + h1.insert(i, i); + i++; + ASSERT_EQ(32, h1.size()) << "h1 size not 32"; + ASSERT_EQ(popLimit + 1, h1.population()) << "h1 pop not " << popLimit + 1; + } + } + void shrinkCondition(){ + typedef LinearProbingHashTable, ModFunction > IntHashTable; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::Pair Pair; + + IntHashTable h1(4); + h1.hash.modulus = 16; + + int i = 0; + { + SCOPED_TRACE("shrink"); + // put as many items as we can without invoking grow() + int popLimit = h1.maxPopulationWithoutGrow(); + for (; i < popLimit; i++){ + h1.insert(i, i); + } + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(popLimit, h1.population()) << "h1 pop not " << popLimit; + + popLimit = h1.minPopulationWithoutShrink(); + int removeCount = h1._population - popLimit; + int j = 0; + for (; j < removeCount; j++){ + h1.remove(j); + } + ASSERT_EQ(16, h1.size()) << "h1 size not 16"; + ASSERT_EQ(popLimit, h1.population()) << "h1 pop not " << popLimit; + // this should trigger shrink + h1.remove(j); + j--; + ASSERT_EQ(8, h1.size()) << "h1 size not " << 8; + ASSERT_EQ(popLimit - 1, h1.population()) << "h1 pop not " << popLimit - 1; + } + } + + }; + + ADD_TEST_F(LinearProbingHashTableTest, insert); + ADD_TEST_F(LinearProbingHashTableTest, copyTable); + ADD_TEST_F(LinearProbingHashTableTest, growCondition); + ADD_TEST_F(LinearProbingHashTableTest, remove); + ADD_TEST_F(LinearProbingHashTableTest, shrinkCondition); + +} +} \ No newline at end of file diff --git a/YASI_12/ds.SeparateChainingHashTable.h b/YASI_12/ds.SeparateChainingHashTable.h new file mode 100644 index 0000000..3d234e1 --- /dev/null +++ b/YASI_12/ds.SeparateChainingHashTable.h @@ -0,0 +1,352 @@ +#pragma once +#include "common.h" +#include "ds.hashtablebase.h" + +using namespace std; + +namespace yasi{ +namespace ds{ + + // Separate chaining collision resolution strategy + // each bucket holds a list of values mapped into that bucket + template< + class Key, + class Value = Key, + class HashFunction = IntHashFunction, + class Pred = KVPairEqualityPredicate + > + class SeparateChainingHashTable : public HashTableBase< + Key, + Value, + DoublyLinkedList< KVPair >*, + HashFunction> + { + ///////////////// enable testing /////////////////// + friend class SeparateChainingHashTableTest; + + protected: + typedef KVPair Pair; + typedef DoublyLinkedList < Pair > List; + typedef typename List::NodeType Node; + public: + typedef List* BucketType; + typedef List ListType; + protected: + // returns the pointer to the value if exists, otherwise returns NULL + Node* bucketNode(BucketType pList, const Key& k) const{ + Pred keyEquals; + for (List::iterator n = pList->begin(); n != pList->end(); n++){ + if (keyEquals((*n).key, k)){ + // found node; + return n.pNode; + } + } + return NULL; + } + Pair* bucketEntry(BucketType pList, const Key& k) const{ + Pred keyEquals; + for (List::iterator n = pList->begin(); n != pList->end(); n++){ + if (keyEquals((*n).key, k)){ + // found node; + return &(n.pNode->element); + } + } + return NULL; + } + bool bucketContains(BucketType pList, const Key& k) const{ + Pred keyEquals; + for (List::iterator n = pList->begin(); n != pList->end(); n++){ + if (keyEquals((*n).key, k)){ + // found node; + return true; + } + } + return false; + } + virtual void copyTable(BucketType* oldTable, const unsigned int oldSize) override { + //BucketType* oldTable = (BucketType*)prevTable; + // copy old elements + for (unsigned int i = 0; i < oldSize; i++){ + BucketType pList; + if (pList = oldTable[i]){ // assigning oldTable[i] to pList + // bucket exists; copy elements + for (List::iterator n = pList->begin(); n != pList->end(); n++){ + Pair p = *n; + put(p.key, p.value); + } + // now delete bucket + pList->clear(); + DELETE_SAFE(oldTable[i]); + } + } + + } + public: + typedef Key KeyType; + typedef Value ValueType; + + virtual ~SeparateChainingHashTable(){ + if (table){ + for (int i = 0; i < _size; i++){ + // each entry is either NULL or a List* + if (table[i]){ + table[i]->clear(); + DELETE_SAFE(table[i]); + } + } + } + } + SeparateChainingHashTable(unsigned int logSize = INIT_LOGSIZE) : HashTableBase(logSize){ + + //collisionHandler(this); + } + // returns true on success, false on failure + virtual void put(const Key& k, const Value& v) override{ + int i = index(k); + BucketType pList = table[i]; + if (pList == NULL){ + // empty slot; create a new list + pList = table[i] = new List(); + // pushFront for better temporal locality + pList->pushFront(Pair(k, v)); + _population++; + } + else{ + // existing bucket + Pair* pEntry = bucketEntry(pList, k); + if (pEntry){ + // key already exists; update value + pEntry->value = v; + } + else{ + pList->pushFront(Pair(k, v)); + _population++; + } + } + // do we need to grow? + if (density() >= DENSITY_MAX) grow(); + } + virtual void put(const Key& k) { + put(k, k); + } + virtual Value* get(const Key& k) const override{ + int i = index(k); + BucketType pList = table[i]; + if (pList != NULL){ + // existing bucket + Pair* pEntry = bucketEntry(pList, k); + if (pEntry) + return &pEntry->value; + } + return NULL; + } + virtual void remove(const Key& k) override{ + int i = index(k); + BucketType pList = table[i]; + if (pList == NULL){ + // the key is absent + // nothing to do + } + else{ + // existing bucket + Node* pNode = bucketNode(pList, k); + if (pNode){ + pList->remove(pNode); + _population--; + // do we need to shrink? + if (density() <= DENSITY_MIN) shrink(); + } + } + } + virtual bool contains(const Key& k) const override{ + int i = index(k); + BucketType pList = table[i]; + if (pList != NULL){ + // existing bucket + return bucketContains(pList, k); + } + return false; + } + + }; + + class SeparateChainingHashTableTest : public yasi::Test{ + protected: + typedef SeparateChainingHashTable IntHashTable; + typedef KVPair Pair; + typedef IntHashTable::BucketType BucketType; + typedef IntHashTable::ListType ListType; + + IntHashTable h; + public: + + void hashCode(){ + // hashcode must be within range + srand((unsigned int)time(NULL)); + for (int i = 0; i < 1000; i++){ + int n = rand(); + int index = h.index(n); + ASSERT_LT(index, h.size()) << "index(" << n << ") out of range"; + ASSERT_GE(index, 0) << "index(" << n << ") out of range"; + } + } + + void all(){ + srand((unsigned int)time(NULL)); + int logSize = h._logSize; + int size = h._size; + ASSERT_EQ(IntHashTable::INIT_LOGSIZE, logSize) << "initial logSize not " << IntHashTable::INIT_LOGSIZE; + ASSERT_EQ(1 << logSize, h.size()) << "table size not 2^" << logSize; + for (int i = 0; i < h.size(); i++){ + ASSERT_EQ(0, (int)h.table[i]) << "table[i] not NULL for i=" << i; + } + + { + SCOPED_TRACE("add items in hashtable"); + // now add 10 items; should not trigger grow() + ASSERT_LT(10 / h.size(), h.DENSITY_MAX) << "10/" << h.size() << " items triggered grow() while DENSITY_MAX=" << h.DENSITY_MAX; + for (int i = 0; i < 10; i++){ + h.put(i, i); + } + // test contains() + for (int i = 0; i < 10; i++){ + ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found"; + } + ASSERT_EQ(false, h.contains(100)) << "absent key 100 was found"; + // test get() + for (int i = 0; i < 10; i++){ + int* pValue = h.get(i); + ASSERT_NE(NULL, (int)pValue) << "pValue with key " << i << " NULL"; + ASSERT_EQ(i, *pValue) << "value with key " << i << " mismatch"; + } + ASSERT_EQ(NULL, h.get(100)) << "absent key 100 was found"; + // test duplicate insert + // should result in update + h.put(5, -6); + int* pValue = h.get(5); + ASSERT_NE(NULL, (int)pValue) << "pValue with key " << 5 << " NULL"; + ASSERT_EQ(-6, *pValue) << "value with key " << 5 << " not -6"; + + // now add some more but don't trigger grow() + size = h.size(); + int maxCurrent = ((int)(h.size() * h.DENSITY_MAX)) - 1; + int currentPop = h.population(); + for (int i = currentPop; i < maxCurrent; i++){ + // this insertion should not trigger grow() + h.put(i, i); + } + ASSERT_EQ(maxCurrent, h.population()) << "population not maxCurrent"; + ASSERT_EQ(size, h.size()) << "size() not size"; + // this insertion should trigger grow() + int key = rand(); + while (h.contains(key)){ key = rand(); } + h.put(key, key); // should trigger grow() + ASSERT_EQ(size * 2, h.size()) << "size() not 2*oldSize"; + ASSERT_EQ(maxCurrent + 1, h.population()) << "population() not maxCurrent+1"; + ASSERT_GE(0.375, h.density()) << "density() > 0.375"; + + // print the table + string str = h.toString(); + cout << "after grow(): " << endl << str << endl; + + // check that all old entries are still in the table + for (int i = 0; i < 10; i++){ // first 10 entries + int v = i; + if (i == 5){ + // remember that we had updated an entry + v = -6; + } + ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found in new table"; + ASSERT_EQ(v, *h.get(i)) << "value with key " << i << " incorrect in new table"; + } + for (int i = currentPop; i < maxCurrent; i++){ // further entries till max capacity before grow + ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found in new table"; + ASSERT_EQ(i, *h.get(i)) << "value with key " << i << " incorrect in new table"; + } + // the entry that triggered grow() + ASSERT_EQ(true, h.contains(key)) << "key " << key << " not found in new table"; + ASSERT_EQ(key, *h.get(key)) << " value with key " << key << " incorrect in new table"; + } + + { + SCOPED_TRACE("remove"); + // now remove entries but do not trigger shrink() + int i = 0; + BucketType pCriticalBucket = NULL; + DoublyLinkedList survivedKeys; + int initPop = h.population(); + int numRemoved = 0; + bool removedEnough = false; + for (; i < h.size(); i++){ + BucketType pList = h.table[i]; + if (pList){ + // number of entries touched: either removed or copied + int remainingItems = pList->size(); + + while (remainingItems > 0){ + // check if we can remove this node without causing shrink() + if (!removedEnough && + ((float)(h._population - 1)) / h._size <= h.DENSITY_MIN){ + // this deletion will cause shrink() + pCriticalBucket = pList; + removedEnough = true; + } + else{ + Pair kvPair = (*pList->begin()); + int key = kvPair.key; + if (removedEnough == false){ + // remove an entry + int prevPop = h._population; + int prevSize = h.size(); + h.remove(key); + ASSERT_EQ(prevPop - 1, h._population) << "remove did not work"; + ASSERT_EQ(h._size, prevSize) << "size changed by remove"; + ASSERT_EQ(false, h.contains(key)) << "removed key " << key << " still remains"; + numRemoved++; + remainingItems--; + } + else{ + // copy this should-be-surviving entry into a list for further verification + survivedKeys.push(kvPair); + remainingItems--; + } + } + } + } + } // for loop through all slots + + ASSERT_EQ(initPop - numRemoved, survivedKeys.size()) << "initSize+numRemoved not survivedKeys.size"; + if (removedEnough) { + // ok; removing next key should cause shrink() + int prevPop = h._population; + int prevSize = h.size(); + int removedKey = (*pCriticalBucket->begin()).key; + h.remove(removedKey); + cout << "shrinked: \n" << h.toString() << endl; + ASSERT_EQ(h._population, prevPop - 1) << "remove did not work"; + ASSERT_EQ(h._size, prevSize >> 1) << "size did not shrink by half"; + ASSERT_EQ(false, h.contains(removedKey)) << "removed key " << removedKey << " still remains"; + + // now check that all should-have-survived keys are still present in the new table + for (DoublyLinkedList::iterator it = survivedKeys.begin(); it != survivedKeys.end(); it++){ + int key = (*it).key; + if (key == removedKey) continue; // this is the removed key that made the table shrink + int value = (*it).value; + ASSERT_EQ(true, h.contains(key)) << "key " << key << " absent in shrinked table"; + ASSERT_NE(NULL, (int)h.get(key)) << "get(" << key << ") is NULL in shrinked table"; + ASSERT_EQ(value, *(h.get(key))) << "get(" << key << ") not " << value << "in shrinked table"; + } + + } + } + + + //ASSERT_EQ(0, 1) << "incomplete test"; + } + }; + + ADD_TEST_F(SeparateChainingHashTableTest, hashCode); + ADD_TEST_F(SeparateChainingHashTableTest, all); + +} +} \ No newline at end of file diff --git a/YASI_12/ds.doublylinkedlist.h b/YASI_12/ds.doublylinkedlist.h index bdefafe..0e6270b 100644 --- a/YASI_12/ds.doublylinkedlist.h +++ b/YASI_12/ds.doublylinkedlist.h @@ -239,6 +239,19 @@ namespace ds{ } }; + // override for printing + template, class Iter = DLLIterator > + std::ostream& operator<< (std::ostream& out, const DoublyLinkedList& list) { + out << list.toString(); + return out; + } + template, class Iter = DLLIterator > + std::ostream& operator<< (std::ostream& out, const DoublyLinkedList* pList) { + out << pList->toString(); + return out; + } + + // test class DoublyLinkedListTest : public yasi::Test { typedef DoublyLinkedList >::node_t node_t; diff --git a/YASI_12/ds.hashtable.h b/YASI_12/ds.hashtable.h deleted file mode 100644 index e91aa88..0000000 --- a/YASI_12/ds.hashtable.h +++ /dev/null @@ -1,750 +0,0 @@ -#pragma once -#include "common.h" -#include "ds.kvpair.h" -#include "ds.doublylinkedlist.h" -#include "ds.iterator.h" -using namespace std; - -namespace yasi{ -namespace ds{ - - -template -class IKeyValueStore{ -protected: - enum { - RESIZE_GROW = 0, - RESIZE_SHRINK - }; - virtual void resize(const int growOrShrink, const unsigned int logFactor) = 0; - void grow() { resize(RESIZE_GROW, 1); } // doubles the capacity - void shrink() { resize(RESIZE_SHRINK, 1); } // halves the capacity -public: - virtual ~IKeyValueStore(){} - virtual Value* get(const Key&) const = 0; - virtual void put(const Key&, const Value&) = 0; - virtual bool contains(const Key&) const = 0; - virtual void remove(const Key&) = 0; -}; - -template -class IHashFunction{ -public: - virtual int operator()(Key n) const = 0; -}; - -template -class IntHashFunction : public IHashFunction{ -public: - virtual int operator()(Key n) const override{ - return n ^ (~n << 11) ^ (n << 3) ^ (~n << 27); - } -}; - -//template -//class ICollisionStrategy{ -// -//public: -// virtual ~ICollisionResolutionStrategy(){} -// // either returns a ptr to the bucket-index, or NULL if no bucket found -// virtual int* findBucket(const Key& k, (void*)pHashTable) = 0; -//}; - - -template< class Key, - class Value, - class BucketType, - class HashFunction -> -class HashTableBase : public IKeyValueStore < Key, Value >{ -protected: - // size of the table - // must be a power of two - unsigned int _size; - unsigned int _logSize; - static const unsigned int INIT_LOGSIZE = 5; // 32 elements - // actual number of keys stored in the table - unsigned int _population; - // the buckets array - BucketType* table; - // the hash function - HashFunction hash; - // load factor for growth and shrinkage - const float DENSITY_MAX; - const float DENSITY_MIN; - // compute hashCode modulo table size - inline int modSize(const unsigned int k) const{ - return k & ((1 << _logSize) - 1); - } - inline int index(const Key& k) const{ - return modSize(hash(k)); // hash(k) % _size - } - BucketType& bucket(const Key& k) const{ - return table[index(k)]; - } - void initTable(BucketType** pTable, const int numElems){ - // initialize to zero - memset(*pTable, 0, numElems * sizeof(BucketType)); - } - inline float density(){ return ((float) _population) / _size; } - // true if the specified population would be too dense for current table - inline float needGrow(const int pop) const { return (((float)pop) / _size) >= DENSITY_MAX; } - // true if the specified population would be too sparse for current table - inline float needShrink(const int pop) const { return (((float)pop) / _size) <= DENSITY_MIN; } - - virtual void copy(BucketType* oldTable, const unsigned int oldSize) = 0; - // grows/shrinks by specified logFactor - // that is, newSize is either oldSize << logFactor (grow) - // or oldSize >> logFactor (shrink) - virtual void resize(int growOrShrink, unsigned int logFactor = 1) { - unsigned int oldLogSize = _logSize; - unsigned int oldSize = _size; - unsigned int oldPopulation = _population; - BucketType* oldTable = table; - unsigned int newLogSize, newSize; - - if (growOrShrink == RESIZE_GROW){ - newLogSize = _logSize + logFactor; - newSize = _size << logFactor; - } - else if (growOrShrink == RESIZE_SHRINK){ - newLogSize = _logSize - logFactor; - newSize = _size >> logFactor; - } - else{ - // do nothing - return; - } - - // great; now we either grow or shrink - _logSize = newLogSize; - _size = newSize; - _population = 0; - table = new BucketType[newSize]; // twice the current size - initTable(&table, newSize); // initialize with zero - // copy old elements - copy(oldTable, oldSize); - // now delete oldTable - DELETE_ARR_SAFE(oldTable); - } // method resize -public: - // the type of the entries in the hash table - HashTableBase():HashTableBase(INIT_LOGSIZE){} - HashTableBase(unsigned int logSize = INIT_LOGSIZE) : _logSize(logSize), _size(1 << logSize), _population(0), DENSITY_MAX(0.75), DENSITY_MIN(0.25){ - assert(_logSize > 0); - table = new BucketType[_size]; - initTable(&table, _size); - } - virtual ~HashTableBase(){ DELETE_ARR_SAFE(table); _size = _population = _logSize = 0; } - - inline unsigned int size(){ return _size; } - inline unsigned int population(){ return _population; } - - - string toString(){ - stringstream buf; - for (int i = 0; i < _size; i++){ - buf << "[" << i << "] "; - if (table[i]) buf << table[i]->toString(); - buf << endl; - } - return buf.str(); - } - -}; - - -// Separate chaining collision resolution strategy -// each bucket holds a list of values mapped into that bucket -template< - class Key, - class Value = Key, - class HashFunction = IntHashFunction, - class Pred = KVPairEqualityPredicate -> -class SeparateChainingHashTable : public HashTableBase< - Key, - Value, - DoublyLinkedList< KVPair >*, - HashFunction> -{ - ///////////////// enable testing /////////////////// - friend class SeparateChainingHashTableTest; - -protected: - typedef KVPair Pair; - typedef DoublyLinkedList < Pair > List; - typedef typename List::NodeType Node; -public: - typedef List* BucketType; - typedef List ListType; -protected: - // returns the pointer to the value if exists, otherwise returns NULL - Node* bucketNode(BucketType pList, const Key& k) const{ - Pred keyEquals; - for (List::iterator n = pList->begin(); n != pList->end(); n++){ - if (keyEquals((*n).key,k)){ - // found node; - return n.pNode; - } - } - return NULL; - } - Pair* bucketEntry(BucketType pList, const Key& k) const{ - Pred keyEquals; - for (List::iterator n = pList->begin(); n != pList->end(); n++){ - if (keyEquals((*n).key, k)){ - // found node; - return & (n.pNode->element); - } - } - return NULL; - } - bool bucketContains(BucketType pList, const Key& k) const{ - Pred keyEquals; - for (List::iterator n = pList->begin(); n != pList->end(); n++){ - if (keyEquals((*n).key, k)){ - // found node; - return true; - } - } - return false; - } - virtual void copy(BucketType* oldTable, const unsigned int oldSize) override { - //BucketType* oldTable = (BucketType*)prevTable; - // copy old elements - for (unsigned int i = 0; i < oldSize; i++){ - BucketType pList; - if (pList = oldTable[i]){ // assigning oldTable[i] to pList - // bucket exists; copy elements - for (List::iterator n = pList->begin(); n != pList->end(); n++){ - Pair p = *n; - put(p.key, p.value); - } - // now delete bucket - pList->clear(); - DELETE_SAFE(oldTable[i]); - } - } - - } -public: - typedef Key KeyType; - typedef Value ValueType; - - virtual ~SeparateChainingHashTable(){ - if (table){ - for (int i = 0; i < _size; i++){ - // each entry is either NULL or a List* - if (table[i]){ - table[i]->clear(); - DELETE_SAFE(table[i]); - } - } - } - } - SeparateChainingHashTable(unsigned int logSize = INIT_LOGSIZE) : HashTableBase(logSize){ - - //collisionHandler(this); - } - // returns true on success, false on failure - virtual void put(const Key& k, const Value& v) override{ - int i = index(k); - BucketType pList = table[i]; - if (pList == NULL){ - // empty slot; create a new list - pList = table[i] = new List(); - // pushFront for better temporal locality - pList->pushFront(Pair(k, v)); - _population++; - } - else{ - // existing bucket - Pair* pEntry = bucketEntry(pList, k); - if (pEntry){ - // key already exists; update value - pEntry->value = v; - } - else{ - pList->pushFront(Pair(k, v)); - _population++; - } - } - // do we need to grow? - if (density() >= DENSITY_MAX) grow(); - } - virtual void put(const Key& k) { - put(k, k); - } - virtual Value* get(const Key& k) const override{ - int i = index(k); - BucketType pList = table[i]; - if (pList != NULL){ - // existing bucket - Pair* pEntry = bucketEntry(pList, k); - if (pEntry) - return &pEntry->value; - } - return NULL; - } - virtual void remove(const Key& k) override{ - int i = index(k); - BucketType pList = table[i]; - if (pList == NULL){ - // the key is absent - // nothing to do - } - else{ - // existing bucket - Node* pNode = bucketNode(pList, k); - if (pNode){ - pList->remove(pNode); - _population--; - // do we need to shrink? - if (density() <= DENSITY_MIN) shrink(); - } - } - } - virtual bool contains(const Key& k) const override{ - int i = index(k); - BucketType pList = table[i]; - if (pList != NULL){ - // existing bucket - return bucketContains(pList,k); - } - return false; - } - -}; - -template< - class Key, - class Value = Key, - class HashFunction = IntHashFunction, - class Pred = KVPairEqualityPredicate -> -class LinearProbingHashTable : public HashTableBase < Key, Value, KVPair*, HashFunction > { - ///////////////// enable testing /////////////////// - friend class LinearProbingHashTableTest; -protected: - typedef KVPair Pair; -public: - typedef Pair* BucketType; - typedef Key KeyType; - typedef Value ValueType; -protected: - // flag about the usage of the first [0] slot - bool _zeroUsed; // true if an entry with key=0 exists - Value _zeroValue; - Pair _zeroPair; // the entry that was mapped to zero index - - inline unsigned int circularNext(const int index) const{ - return modSize(index + 1); - } - inline unsigned int circularPrev(const int index) const{ - return modSize(index - 1); - } - - - void insert(const Key& k, const Value& v){ - Pair* pair = insertKey(k); - if (pair){ - pair->value = v; - } - else{ - // something is wrong, insertKey() failed - } - } - - // the key must be present in the table - - Pair* lookupKey(const Key& k) const { - // test the zero key - if (k == 0){ - if (_zeroUsed) return const_cast(& _zeroPair); - else return NULL; - } - else{ - // non-zero key - Pred keyEquals; - unsigned int firstBucket = index(k); - int cur = firstBucket; - do{ - Pair* pEntry = table[cur]; - - if (pEntry == NULL){ - // this slot must be empty - // because we started from the firstBucket, - // the key is not present in the table - return NULL; - } - else{ - // this slot is occupied; check key - if (keyEquals(k, pEntry->key)){ - // found match - return pEntry; - } - else{ - // move on to the next slot - cur = modSize(cur + 1); - } - } // - } while (cur != firstBucket); - // we checked all slots of the table; no match - return NULL; - } - } - - Pair* insertKey(const Key& k) { - - // insert/update the entry with key 0 - if (((int)k) == 0){ - // we will use a special slot for this entry - if (_zeroUsed == false) - _zeroUsed = true; - _zeroPair.key = k; - _population++; - // see if we need to size up - if (needGrow(_population )) - grow(); - return &_zeroPair; - } - else{ - // key is non-zero - Pred keyEquals; - - // try all cells in the table, starting from the first (hashed) bucket - // if all cells are occupied, grow the table and keep trying - while (true){ - unsigned int firstBucket = index(k); - int cur = firstBucket; - do{ - Pair* pEntry = table[cur]; - - if (pEntry == NULL){ - // this slot must be empty, - // insert here - pEntry->key = k; - _population++; - // see if we need to size up - if (needGrow(_population)){ - grow(); - } - return pEntry; - } - else{ - // this slot is occupied; check key - if (keyEquals(k, pEntry->key)){ - // found match - return pEntry; - } - else{ - // move on to the next slot - cur = modSize(cur + 1); - } - } // - } while (cur != firstBucket); - // we checked all slots of the table; no match - // try again after resizing - grow(); - } - return NULL; - } - } - - virtual void copy(BucketType* oldTable, const unsigned int oldSize) override { - // the zeroPair stays intact because it is determined by key, not hash value - // copy table elements - //BucketType* oldTable = (BucketType*)prevTable; - for (unsigned int i = 0; i < oldSize; i++){ - Pair* p = oldTable[i]; - if (p){ - insert(p->key, p->value); - DELETE_SAFE(oldTable[i]); - } - } - } - -public: - typedef Pair* BucketType; - LinearProbingHashTable(unsigned int logSize = INIT_LOGSIZE) : _zeroUsed(false), HashTableBase(logSize){ - - } - virtual ~LinearProbingHashTable(){ - if (table){ - for (unsigned int i = 0; i < _size; i++){ - DELETE_SAFE(table[i]); - } - } - _zeroUsed = false; - } - virtual Value* get(const Key& key) const override { - Pair* kv = lookupKey(key); - if (kv) - return & (kv->value); - else - return NULL; - } - - virtual void put(const Key& key, const Value& value) override { return insert(key, value); } - virtual bool contains(const Key& key) const override { return lookupKey(key) == NULL; } - virtual void remove(const Key& k) override { - // zero key - if (k == 0){ - if (_zeroUsed) { - _zeroUsed = false; - _population--; - if (needShrink(_population)) - shrink(); - } - } - else{ - // non-zero key - Pred keyEquals; - unsigned int firstBucket = index(k); - int cur = firstBucket; - do{ - Pair* pEntry = table[cur]; - - if (pEntry == NULL){ - // this slot must be empty - // because we started from the firstBucket, - // the key is not present in the table - return; - } - else{ - // this slot is occupied; check key - if (keyEquals(k, pEntry->key)){ - // remove - DELETE_SAFE(table[cur]); - _population--; - if (needShrink(_population)) - shrink(); - else{ - // shuffle the entries from right to left until an empty slot is found - // (there must be one because we just deleted one) - // this will fix all other's linear probing sequence - const unsigned int startBucket = cur; - unsigned int neighbor = circularNext(cur); - while (neighbor != startBucket && - table[neighbor] != NULL){ - table[cur] = table[neighbor]; - - cur = neighbor; - neighbor = circularNext(cur); - } - table[cur] = NULL; - } - // done - return; - } - else{ - // key didn't match - // move on to the next slot - cur = modSize(cur + 1); - } - } // - } while (cur != firstBucket); - // we checked all slots of the table; no key match - // cannot remove; done - } - return; - } - -}; - -class LinearProbingHashTableTest : public yasi::Test{ -protected: - typedef LinearProbingHashTable IntHashTable; - typedef KVPair Pair; - typedef IntHashTable::BucketType BucketType; - - IntHashTable h; -public: - void all(){ - ASSERT_EQ(0, 1) << "incomplete test"; - } -}; - -ADD_TEST_F(LinearProbingHashTableTest, all); - -class SeparateChainingHashTableTest : public yasi::Test{ -protected: - typedef SeparateChainingHashTable IntHashTable; - typedef KVPair Pair; - typedef IntHashTable::BucketType BucketType; - typedef IntHashTable::ListType ListType; - - IntHashTable h; -public: - - void hashCode(){ - // hashcode must be within range - srand((unsigned int)time(NULL)); - for (int i = 0; i < 1000; i++){ - int n = rand(); - int index = h.index(n); - ASSERT_LT(index, h.size()) << "index(" << n << ") out of range"; - ASSERT_GE(index, 0) << "index(" << n << ") out of range"; - } - } - - void all(){ - srand((unsigned int)time(NULL)); - int logSize = h._logSize; - int size = h._size; - ASSERT_EQ(IntHashTable::INIT_LOGSIZE, logSize) << "initial logSize not " << IntHashTable::INIT_LOGSIZE; - ASSERT_EQ(1 << logSize, h.size()) << "table size not 2^" << logSize; - for (int i = 0; i < h.size(); i++){ - ASSERT_EQ(0, (int)h.table[i]) << "table[i] not NULL for i=" << i; - } - - { - SCOPED_TRACE("add items in hashtable"); - // now add 10 items; should not trigger grow() - ASSERT_LT(10 / h.size(), h.DENSITY_MAX) << "10/" << h.size() << " items triggered grow() while DENSITY_MAX=" << h.DENSITY_MAX; - for (int i = 0; i < 10; i++){ - h.put(i, i); - } - // test contains() - for (int i = 0; i < 10; i++){ - ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found"; - } - ASSERT_EQ(false, h.contains(100)) << "absent key 100 was found"; - // test get() - for (int i = 0; i < 10; i++){ - int* pValue = h.get(i); - ASSERT_NE(NULL, (int)pValue) << "pValue with key " << i << " NULL"; - ASSERT_EQ(i, *pValue) << "value with key " << i << " mismatch"; - } - ASSERT_EQ(NULL, h.get(100)) << "absent key 100 was found"; - // test duplicate insert - // should result in update - h.put(5, -6); - int* pValue = h.get(5); - ASSERT_NE(NULL, (int)pValue) << "pValue with key " << 5 << " NULL"; - ASSERT_EQ(-6, *pValue) << "value with key " << 5 << " not -6"; - - // now add some more but don't trigger grow() - size = h.size(); - int maxCurrent = ((int)(h.size() * h.DENSITY_MAX)) - 1; - int currentPop = h.population(); - for (int i = currentPop; i < maxCurrent; i++){ - // this insertion should not trigger grow() - h.put(i, i); - } - ASSERT_EQ(maxCurrent, h.population()) << "population not maxCurrent"; - ASSERT_EQ(size, h.size()) << "size() not size"; - // this insertion should trigger grow() - int key = rand(); - while (h.contains(key)){ key = rand(); } - h.put(key, key); // should trigger grow() - ASSERT_EQ(size * 2, h.size()) << "size() not 2*oldSize"; - ASSERT_EQ(maxCurrent + 1, h.population()) << "population() not maxCurrent+1"; - ASSERT_GE(0.375, h.density()) << "density() > 0.375"; - - // print the table - string str = h.toString(); - cout << "after grow(): " << endl << str << endl; - - // check that all old entries are still in the table - for (int i = 0; i < 10; i++){ // first 10 entries - int v = i; - if (i == 5){ - // remember that we had updated an entry - v = -6; - } - ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found in new table"; - ASSERT_EQ(v, *h.get(i)) << "value with key " << i << " incorrect in new table"; - } - for (int i = currentPop; i < maxCurrent; i++){ // further entries till max capacity before grow - ASSERT_EQ(true, h.contains(i)) << "key " << i << " not found in new table"; - ASSERT_EQ(i, *h.get(i)) << "value with key " << i << " incorrect in new table"; - } - // the entry that triggered grow() - ASSERT_EQ(true, h.contains(key)) << "key " << key << " not found in new table"; - ASSERT_EQ(key, *h.get(key)) << " value with key " << key << " incorrect in new table"; - } - - { - SCOPED_TRACE("remove"); - // now remove entries but do not trigger shrink() - int i = 0; - BucketType pCriticalBucket = NULL; - DoublyLinkedList survivedKeys; - int initPop = h.population(); - int numRemoved = 0; - bool removedEnough = false; - for (; i < h.size(); i++){ - BucketType pList = h.table[i]; - if (pList){ - // number of entries touched: either removed or copied - int remainingItems = pList->size(); - - while (remainingItems > 0){ - // check if we can remove this node without causing shrink() - if (!removedEnough && - ((float)(h._population - 1)) / h._size <= h.DENSITY_MIN){ - // this deletion will cause shrink() - pCriticalBucket = pList; - removedEnough = true; - } - else{ - Pair kvPair = (*pList->begin()); - int key = kvPair.key; - if (removedEnough == false){ - // remove an entry - int prevPop = h._population; - int prevSize = h.size(); - h.remove(key); - ASSERT_EQ(prevPop - 1, h._population) << "remove did not work"; - ASSERT_EQ(h._size, prevSize) << "size changed by remove"; - ASSERT_EQ(false, h.contains(key)) << "removed key " << key << " still remains"; - numRemoved++; - remainingItems--; - } - else{ - // copy this should-be-surviving entry into a list for further verification - survivedKeys.push(kvPair); - remainingItems--; - } - } - } - } - } // for loop through all slots - - ASSERT_EQ(initPop - numRemoved, survivedKeys.size()) << "initSize+numRemoved not survivedKeys.size"; - if (removedEnough) { - // ok; removing next key should cause shrink() - int prevPop = h._population; - int prevSize = h.size(); - int removedKey = (*pCriticalBucket->begin()).key; - h.remove(removedKey); - cout << "shrinked: \n" << h.toString() << endl; - ASSERT_EQ(h._population, prevPop - 1) << "remove did not work"; - ASSERT_EQ(h._size, prevSize >> 1) << "size did not shrink by half"; - ASSERT_EQ(false, h.contains(removedKey)) << "removed key " << removedKey << " still remains"; - - // now check that all should-have-survived keys are still present in the new table - for (DoublyLinkedList::iterator it = survivedKeys.begin(); it != survivedKeys.end(); it++){ - int key = (*it).key; - if (key == removedKey) continue; // this is the removed key that made the table shrink - int value = (*it).value; - ASSERT_EQ(true, h.contains(key)) << "key " << key << " absent in shrinked table"; - ASSERT_NE(NULL, (int)h.get(key)) << "get(" << key << ") is NULL in shrinked table"; - ASSERT_EQ(value, *(h.get(key))) << "get(" << key << ") not " << value << "in shrinked table"; - } - - } - } - - - //ASSERT_EQ(0, 1) << "incomplete test"; - } -}; - -ADD_TEST_F(SeparateChainingHashTableTest, hashCode); -ADD_TEST_F(SeparateChainingHashTableTest, all); - -} // namespace ds -} // namespace yasi \ No newline at end of file diff --git a/YASI_12/ds.hashtablebase.h b/YASI_12/ds.hashtablebase.h new file mode 100644 index 0000000..1a17038 --- /dev/null +++ b/YASI_12/ds.hashtablebase.h @@ -0,0 +1,178 @@ +#pragma once +#include "common.h" +#include "ds.kvpair.h" +#include "ds.doublylinkedlist.h" +#include "ds.iterator.h" +using namespace std; + +namespace yasi{ +namespace ds{ + + +template +class IKeyValueStore{ +protected: + enum { + RESIZE_GROW = 0, + RESIZE_SHRINK + }; + virtual void resize(const int growOrShrink, const unsigned int logFactor) = 0; + void grow() { resize(RESIZE_GROW, 1); } // doubles the capacity + void shrink() { resize(RESIZE_SHRINK, 1); } // halves the capacity +public: + virtual ~IKeyValueStore(){} + virtual Value* get(const Key&) const = 0; + virtual void put(const Key&, const Value&) = 0; + virtual bool contains(const Key&) const = 0; + virtual void remove(const Key&) = 0; +}; + +template +class IHashFunction{ +public: + virtual int operator()(Key n) const = 0; +}; + +template +class IntHashFunction : public IHashFunction{ +public: + virtual int operator()(Key n) const override{ + return n ^ (~n << 11) ^ (n << 3) ^ (~n << 27); + } +}; + + +//template +//class ICollisionStrategy{ +// +//public: +// virtual ~ICollisionResolutionStrategy(){} +// // either returns a ptr to the bucket-index, or NULL if no bucket found +// virtual int* findBucket(const Key& k, (void*)pHashTable) = 0; +//}; + + +template< class Key, + class Value, + class BucketType, + class HashFunction +> +class HashTableBase : public IKeyValueStore < Key, Value >{ +protected: + + // size of the table + // must be a power of two + unsigned int _size; + unsigned int _logSize; + static const unsigned int INIT_LOGSIZE = 5; // 32 elements + // actual number of keys stored in the table + unsigned int _population; + // the buckets array + BucketType* table; + // the hash function + HashFunction hash; + // load factor for growth and shrinkage + const float DENSITY_MAX; + const float DENSITY_MIN; + // compute hashCode modulo table size + inline int modSize(const unsigned int k) const{ + return k & ((1 << _logSize) - 1); + } + inline int index(const Key& k) const{ + return modSize(hash(k)); // hash(k) % _size + } + BucketType& bucket(const Key& k) const{ + return table[index(k)]; + } + void initTable(BucketType** pTable, const int numElems){ + // initialize to zero + memset(*pTable, 0, numElems * sizeof(BucketType)); + } + inline float density(){ return ((float) _population) / _size; } + // true if the specified population would be too dense for current table + inline float needGrow(const int pop) const { return (((float)pop) / _size) >= DENSITY_MAX; } + // true if the specified population would be too sparse for current table + inline float needShrink(const int pop) const { return (((float)pop) / _size) <= DENSITY_MIN; } + + inline unsigned int maxPopulationWithoutGrow() const{ + return (unsigned int)(_size * DENSITY_MAX) - 1; + } + inline unsigned int minPopulationWithoutShrink() const{ + return (unsigned int)(_size * DENSITY_MIN) + 1; + } + + virtual void copyTable(BucketType* oldTable, const unsigned int oldSize) = 0; + // grows/shrinks by specified logFactor + // that is, newSize is either oldSize << logFactor (grow) + // or oldSize >> logFactor (shrink) + virtual void resize(int growOrShrink, unsigned int logFactor = 1) { + unsigned int oldLogSize = _logSize; + unsigned int oldSize = _size; + unsigned int oldPopulation = _population; + BucketType* oldTable = table; + unsigned int newLogSize, newSize; + + if (growOrShrink == RESIZE_GROW){ + newLogSize = _logSize + logFactor; + newSize = _size << logFactor; + } + else if (growOrShrink == RESIZE_SHRINK){ + newLogSize = _logSize - logFactor; + newSize = _size >> logFactor; + } + else{ + // do nothing + return; + } + + // great; now we either grow or shrink + _logSize = newLogSize; + _size = newSize; + _population = 0; + table = new BucketType[newSize]; // twice the current size + initTable(&table, newSize); // initialize with zero + // copy old elements + // copy table elements + copyTable(oldTable, oldSize); + // now delete oldTable + DELETE_ARR_SAFE(oldTable); + } // method resize +public: + // the type of the entries in the hash table + HashTableBase():HashTableBase(INIT_LOGSIZE){} + HashTableBase(unsigned int logSize = INIT_LOGSIZE) : _logSize(logSize), _size(1 << logSize), _population(0), DENSITY_MAX(0.75), DENSITY_MIN(0.25){ + assert(_logSize > 0); + table = new BucketType[_size]; + initTable(&table, _size); + } + virtual ~HashTableBase(){ DELETE_ARR_SAFE(table); _size = _population = _logSize = 0; } + + inline unsigned int size(){ return _size; } + inline unsigned int population(){ return _population; } + + + string toString() const{ + stringstream buf; + for (int i = 0; i < _size; i++){ + buf << "[" << i << "] "; + if (table[i]) buf << table[i]; + buf << endl; + } + return buf.str(); + } + +}; +// override for printing +template< class Key, + class Value, + class BucketType, + class HashFunction +> +std::ostream& operator<< (std::ostream& out, const HashTableBase& h) { + out << h.toString(); + return out; +} + + +} // namespace ds +} // namespace yasi \ No newline at end of file diff --git a/YASI_12/ds.kvpair.h b/YASI_12/ds.kvpair.h index 63989cc..164e1f1 100644 --- a/YASI_12/ds.kvpair.h +++ b/YASI_12/ds.kvpair.h @@ -32,6 +32,50 @@ namespace yasi{ out << kv.key; return out; } + template + std::ostream& operator<< (std::ostream& out, const KVPair* pKv) { + out << pKv->key; + return out; + } + + // class KeyOnly + // for stroing keys without values + // will save space where values are not important + template + class KeyOnly : public IComparable>{ + typedef KeyOnly self; + public: + // still support the KVPair interface + // i.e., this->key and this->value are both meaningful (and the same) + union{ + Key key; + Value value; + }; + + virtual ~KeyOnly(){} + KeyOnly(){} + KeyOnly(const Key& k, const Value& v) : key(k){} // ignore value + // need explicit because otherwise copy-constructor can be used to unwantedly put a KVPair as key + explicit KeyOnly(const Key& k) : key(k){} + KeyOnly(const self& other) :key(other.key){} + self& operator= (const self& other){ key = other.key; return *this; } + inline bool operator==(const self& other) const override{ return key == other.key; } + inline bool operator< (const self& other) const override{ return key < other.key; } + inline bool operator<= (const self& other) const override{ return key <= other.key; } + inline bool operator!=(const self& other) const { return !((*this) == other); } + }; + // override for printing + template + std::ostream& operator<< (std::ostream& out, const KeyOnly& kv) { + out << kv.key; + return out; + } + template + std::ostream& operator<< (std::ostream& out, const KeyOnly* pKv) { + out << pKv->key; + return out; + } + template class KVPairEqualityPredicate{ diff --git a/YASI_12/ds.list.h b/YASI_12/ds.list.h index bfdd8f2..d4223e5 100644 --- a/YASI_12/ds.list.h +++ b/YASI_12/ds.list.h @@ -2,6 +2,7 @@ #include "common.h" #include "utils.h" #include "ds.iterator.h" +#include using namespace std; namespace yasi{ @@ -20,7 +21,10 @@ class IList{ virtual bool empty() const = 0; virtual Iter begin() const = 0; virtual Iter end() const = 0; + }; + + } // namespace ds } // namespace yasi \ No newline at end of file diff --git a/YASI_12/ds.singlylinkedlist.h b/YASI_12/ds.singlylinkedlist.h index 24a1995..857ae37 100644 --- a/YASI_12/ds.singlylinkedlist.h +++ b/YASI_12/ds.singlylinkedlist.h @@ -276,6 +276,17 @@ class SinglyLinkedList : public virtual ISinglyLinkedList < E, Node, Iter > { }; +// override for printing +template, class Iter = SLLIterator > +std::ostream& operator<< (std::ostream& out, const SinglyLinkedList& list) { + out << list.toString(); + return out; +} +template, class Iter = SLLIterator > +std::ostream& operator<< (std::ostream& out, const SinglyLinkedList* pList) { + out << pList->toString(); + return out; +} class SinglyLinkedListTest : public yasi::Test{ typedef SinglyLinkedList >::node_t node_t; diff --git a/YASI_12/main.cpp b/YASI_12/main.cpp index 286f9ee..1c2fa49 100644 --- a/YASI_12/main.cpp +++ b/YASI_12/main.cpp @@ -7,7 +7,8 @@ #include "ds.binarysearchtree.h" #include "ds.priorityqueue.h" #include "ds.BSTDictionary.h" -#include "ds.hashtable.h" +#include "ds.separatechaininghashtable.h" +#include "ds.linearprobinghashtable.h" //#include "Sorter.h" #include diff --git a/gtest-1.7.0/msvc/gtest/gtest.tlog/CL.read.1.tlog b/gtest-1.7.0/msvc/gtest/gtest.tlog/CL.read.1.tlog index b72e1ffa25ec8c71c51844a7f50260d1799a8a9a..5f26b7297a18348bfb791e5bf8efa0cd96ceb83f 100644 GIT binary patch delta 45 ycmaE|km=hZrVURfOwQ=doA{4I#+M diff --git a/gtest-1.7.0/msvc/gtest/vc120.idb b/gtest-1.7.0/msvc/gtest/vc120.idb index 4b9636d0f0d5cdbdf8691b4ab8074f16b556015e..56f7d00a3647ba440c650c9966ad57725ce6eebe 100644 GIT binary patch delta 76941 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 EKT5pIPyhe` delta 19949 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 RaW;2_-ID$OSrT^q{{V98Z5{vs diff --git a/gtest-1.7.0/msvc/gtestd.lib b/gtest-1.7.0/msvc/gtestd.lib index 7b5cd8079c5919adae78167f454d6c056039a0db..8a8264dc68751ff690826448c574216c24752455 100644 GIT binary patch delta 92229 zcmbrn2YeRA^FRLF%!mz(c440Ya53pkf6D1ja@c z0a2>TiGqL~1OY1`3SvX0T0l_b|K7bP4bcC`@6Xo@@44OCnc3Od+1c6I%jv@xgwyyp zKh)YbB|T+!)f5Z@PVy6t@!7Pe{T5aZfxD@v41tMqI(8<-f#Z$ z9^@G-UVrF;c7r_euLb^j;h(qBZjf|L6#9{Es1%mkuZ_hbSh^MEb+gD8ca^=0mg1sb zcvqe8E|!YCs_Kf;dJw7^Dvc}Y-Hk!^s&W*ywJ3mO?;h+ur?RTTqB~1GSxL8|%JS^0 z+(L`pSsKksEAn#7D!N&sP*zLf!=z}Tmhy&4VR#G~CWYg1|1c>Qj}2zsN5iBqA zCB$Wem|&^wQ|ahkRGMlsz{*5kR+61-N#JP9?vz@h&D1+N_T_g%W3l*K za*9g3RaRwJRaZK?p;O(8N((Hpoc^H^Qk*LT3Z#-zQYZzEl)TV3cBB-KN7+cu$fS|H z(@RG3P8%aRlV6OKA^>vDEDWuc5;>k|5^5z~t1d6E$g8Zxh{Q2EAP~zd=;2yP;ec`c z-3MIdLDJpxa;q9Z<4w@xwNfA`T&|Vc;1M^9(<>Uq-=>V>a$7wLvZtK)@T&4yLb~>BsQF(SnWu7B9yR@vdC>Nl&n|N5I z=&a1ID9S7CR@}!D1RSU7>{uySI880aNx^{(%+(3jtt_{?B(Jo}62ZZ;#z~Qptlp!( zo~cKkqo~r6SDBk#o@WW>aQBUqdIH^Npn6_@2^R~40&@^Ls#o5n-dr|BTTFdW~Hm);kW zY10HL6ps%lKs}P_!URl#WRfRJF`>yASgR$sFuSxMkB>q@UTI!Mb}`46Og$$8TQZHE zDD~0LgMGo0o9oEM{3zzEpQo=TO1_D#Mr1YR*${}c3S};=4D;Ao%zAa6!Y4_35^Leg zYV*tUvn#96sF-(}mAkQWSOs3lOwf56I0@Q%p5{-I?hy9VnMvrz&m`X^6$odj*Ik%# zXXq~T@x)zV_zb;jK91Z4Wj{lI-zCL`oZ+bR^Dx6J@*FvNh1tD|$|@=?(V%dKawc=g zJ11kVoT2%XA+IyEX)>nF89Hhf3R7T5&QSCe%#|}#I7LdvV~Y8H z5y0r_mU?=XmBrP!Sz2;ht*1(@0NiIPOyL>2f2!0uhynXI0N++pTv%0AZi(mMUrv=0 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 delta 92027 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