📄 hashset.h~
字号:
#ifndef HASHSET_H
#define HASHSET_H
//
// Hash table implementation of set, using linear probing
//
// Based loosely on the hash_table class from Chapter 17
// of
// Data Structures in C++ using the STL
// Published by Addison-Wesley, 1997
// Written by Tim Budd, budd@cs.orst.edu
// Oregon State University
//
// Steven Zeil: Heavily modified, combined two classes,
// added erase function,
// added comparison template parameter, const's
/*{*/ #include <utils/visint.h>
#include <algorithm>
#include <functional>
enum HashStatus { Occupied, Empty, Deleted };
template <class T>
struct HashEntry /*{*/: public Visible /*}*/
{
T data;
HashStatus info;
HashEntry(): info(Empty) /*{*/, Visible(AlgAE::PaleCyan) /*}*/ {}
HashEntry(const T& v, HashStatus status)
: data(v), info(status) /*{*/, Visible(AlgAE::PaleCyan) /*}*/{}
/*{*/ virtual void touchAllPointers() const
/*{*/ { }
/*{*/
/*{*/ virtual void writeText(ostream& out) const
/*{*/ {
/*{*/ if (info == Deleted)
/*{*/ out << "--del--";
/*{*/ else
/*{*/ {
/*{*/ out << data;
/*{*/ for (int i = data.size(); i <= 8; ++i)
/*{*/ out << ' ';
/*{*/ }
/*{*/ }
};
template <class T, int hSize, class HashFun, class CompareEQ=equal_to<T> >
class hash_set /*{*/: public Visible /*}*/
{
public:
hash_set (): /*{*/Visible(AlgAE::Blue), /*}*/ theSize(0)
{/*{*/for (int i = 0; i < hSize; ++i) {table[i].setName(itos(i));} /*}*/}
bool empty() const {return theSize == 0;}
int size() const {return theSize;}
bool insert (const T& element)
{/*{*/algae->FRAME("starting insert");
/*{*/VisibleInteger h0 (hash(element), "h0");
/*{*/ // /*}*/ unsigned h0 = hash(element);
/*{*/VisibleInteger h (find(element, h0), "h");
/*{*/h.show();
/*{*/h0.show();
/*{*/ // /*}*/ unsigned h = find(element, h0);
/*{*/algae->FRAME("insert: is element already in table?");
if (h == hSize) {
/*{*/VisibleInteger count (0, "count");
/*{*/count.show();
/*{*/ // /*}*/ unsigned count = 0;
h = h0;
/*{*/table[h].highlight(AlgAE::PaleGreen);algae->FRAME("start searching for an open spot");
while (table[h].info == Occupied
&& count < hSize)
{/*{*/algae->FRAME("not here - keep going.");
++count;
h = (h0 + /*f(count)*/ count) % hSize;/*{*/table[h].highlight(AlgAE::PaleGreen); /*}*/
}
/*{*/algae->FRAME("insert: did we find a spot?");
if (count >= hSize)
return false; // could not add
else
{ /*{*/algae->FRAME("insert: put the data here");
table[h].info = Occupied;
table[h].data = element;
/*{*/algae->FRAME("inserted");
return true;
}
}
else {/*{*/algae->FRAME("item is already in set"); /*}*/ // replace
table[h].data = element;
/*{*/algae->FRAME("inserted.");
return true;
}
}
int count (const T& element)
{/*{*/algae->FRAME("starting count");
/*{*/VisibleInteger h0 (hash(element), "h0");
/*{*/h0.show();
/*{*/ // /*}*/ unsigned h0 = hash(element);
/*{*/VisibleInteger h (find(element, h0), "h");
/*{*/h.show();
/*{*/ // /*}*/ unsigned h = find(element, h0);
/*{*/algae->FRAME("count: is element in table?");
return (h != hSize) ? 1 : 0;
}
void erase (const T& element)
{/*{*/algae->FRAME("starting erase");
/*{*/VisibleInteger h0 (hash(element), "h0");
/*{*/ // /*}*/ unsigned h0 = hash(element);
/*{*/VisibleInteger h (find(element, h0), "h");
/*{*/h0.show();
/*{*/h.show();
/*{*/ // /*}*/ unsigned h = find(element, h0);
/*{*/algae->FRAME("erase: is element already in table?");
if (h != hSize)
table[h].info = Deleted;
/*{*/algae->FRAME("erased");
}
void clear()
{
for (int i = 0; i < hSize; ++i)
{
table[i].info = Empty;
}
}
/*{*/
/*{*/ virtual void writeText (class ostream& out) const
/*{*/ {
/*{*/ out << theSize;
/*{*/ }
/*{*/ virtual void touchAllComponents() const
/*{*/ {
/*{*/ for (int i = 0; i < hSize; ++i)
/*{*/ touch(table[i]);
/*{*/ }
private:
int find (const T& element, int h0) const
{/*{*/algae->FRAME("starting find");
/*{*/VisibleInteger h00 (h0, "h0");
/*{*/h00.show();
/*{*/VisibleInteger h (h0 % hSize, "h");
/*{*/h.show();
/*{*/ // /*}*/ unsigned h = h0 % hSize;
/*{*/VisibleInteger count (0, "count");
/*{*/count.show();
/*{*/ // /*}*/ unsigned count = 0;
/*{*/table[h].highlight(AlgAE::Yellow);algae->FRAME("start the search");
while ((table[h].info == Deleted ||
(table[h].info == Occupied
&& (!compare(table[h].data, element))))
&& count < hSize)
{/*{*/algae->FRAME("not here - keep going");
++count;
h = (h0 + /*f(count)*/ count) % hSize;/*{*/table[h].highlight(AlgAE::Yellow); /*}*/
}
/*{*/algae->FRAME("find: did we find it?");
if (count >= hSize
|| table[h].info == Empty)
return hSize;
else
return h;
}
HashEntry<T> table[hSize];
int theSize;
HashFun hash;
CompareEQ compare;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -