加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

HashTable简单达成

发布时间:2021-11-21 19:57:14 所属栏目:教程 来源:互联网
导读:本文中实现了一个简单的hashtable,不一定实用,但是反应出了hashtable的原理,而且若是面试中让实现一个hashtable,本文的实现足以应付,我在一次迅雷的面试中就遇到,让实现一个hashtable。 本文中采用开链法(separate chaining)来处理冲突(collision)

本文中实现了一个简单的hashtable,不一定实用,但是反应出了hashtable的原理,而且若是面试中让实现一个hashtable,本文的实现足以应付,我在一次迅雷的面试中就遇到,让实现一个hashtable。
 
本文中采用开链法(separate chaining)来处理“冲突”(collision),而且hashtable只存储唯一的元素,不存在重复。
 
实现代码如下:
 
class hashtable
{
public:
 // 构造函数,n为想要构造的hashtable的bucket数量
 hashtable(size_t n);
 ~hashtable();
 // 插入元素。若元素不存在,插入成功返回true;若元素已存在则插入失败,返回false
 bool insert(const int val);
 // 查找元素是否在表中出现
 bool find(const int val);
 // 删除元素。若元素存在,删除成功返回true;若元素不存在则删除失败,返回false
 bool erase(const int val);
 // 清除所有元素
 void clear();
 // 返回已有元素数目
 size_t size();
private:
 // bucket中的节点
 struct hashtable_node
 {
  hashtable_node *next;
  int val;
  hashtable_node(int _val, hashtable_node *_next = NULL):val(_val), next(_next){};
 };
 // hash函数
 size_t hash(unsigned int long x);
 // 寻找大于等于n且最接近n的质数
 unsigned long next_prime(unsigned long n);
 // bucket向量表
 vector<hashtable_node*> buckets;
 // 元素个数
 size_t num_elements;
};
hashtable::hashtable(size_t n)
{
 // 将bucket数量设置为大于等于n且最接近n的质数
 const size_t n_buckets = next_prime(n);
 buckets.reserve(n_buckets);
 buckets.insert(buckets.end(), n_buckets, NULL);
 num_elements = 0;
};
hashtable::~hashtable()
{
 // 清除所有链中的节点
 clear();
}
bool hashtable::insert(const int val)
{
 // 不重复插入。已存在,返回false
 if(find(val)) return false;
 // 调用hash函数获得bucket号
 const size_t k = hash(val);
 // 将新节点直接插入到链表头部
 hashtable_node * tmp = new hashtable_node(val);
 tmp->next = buckets[k];
 buckets[k] = tmp;
 ++num_elements;
 // 插入成功
 return true;
}
bool hashtable::find(const int val)
{
 const size_t k = hash(val);
 hashtable_node *p = buckets[k];
 // 在对应的bucket中查找
 while(p != NULL)
 {
  if(p->val = val) return true;
  p = p->next;
 }
 return false;
}
bool hashtable::erase(const int val)
{
 const size_t k = hash(val);
 hashtable_node *p = buckets[k];
 hashtable_node *pre = NULL;
 // 找到该节点
 while(p != NULL && p->val != val)
 {
  pre = p;
  p = p->next;
 }
 // 删除该节点
 if(p == NULL) return false;
 if(pre == NULL)
  buckets[k] = p->next;
 else
  pre->next = p->next;
 delete p;
 return true;
}
void hashtable::clear()
{
 // 清除所有链中的节点
 for(int i = 0; i < buckets.size(); i++)
 {
  hashtable_node *p = buckets[i];
  while(p != NULL)
  {
   hashtable_node *next = p->next;
   delete p;
   p = next;
  }
 }
}
size_t hashtable::size()
{
 return num_elements;
}
size_t hashtable::hash(unsigned int long x)
{
 return x % buckets.size();
}
unsigned long hashtable::next_prime(unsigned long n)
{
 static const int num_primes = 28;
 static const unsigned long prime_list[num_primes] =
 {
  53,          97,          193,          389,        769,
  1543,        3079 ,        6151,        12289,      24593,
  49157,      98317,        196613,      393241,    786433,
  1572869,    3145739,      6291469,      12582917,  25165843,
  50331653,    100663319,    201326611,    402653189,  805306457,
  1610612741,  3221225473ul, 4294967291ul                                       
 };
 // 寻找大于等于n且最接近n的质数
 int i = 0;
 while(i < num_primes && prime_list[i] < n)
  i++;
 return i == num_primes ? prime_list[num_primes-1] : prime_list[i];
}

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读