⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashset.h~

📁 ALGAE是一个快速创建算法演示的框架。目前支持的算法实现语言包括java和c
💻 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 + -