第11章:散列表

原创 2016年05月30日 22:20:45

下面代码用分离链接法实现散列表:

1:将一个输入元素利用散列函数散列到某一个值:

int hash(int key)
{
        return key;
}
int hash(const string& key)
{
        int hashVal=0;
        for(string::size_type ix=0;ix!=key.size();ix++)
                hashVal=37*hashVal+key[ix];
        return hashVal;
}
template<class Type>
int HashTable<Type>::myHash(const Type& key) const
{
        int hashVal=hash(key);

        //vector<list<Type> > theLists
        hashVal%=theLists.size(); // 用到的是除法散列法,所以这个哈希表的size()为素数
        if(hashVal<0)
                hashVal+=theLists.size();
        return hashVal;
}

2:插入操作:
代码如下:

template<class Type>
bool HashTable<Type>::insert(const Type& val)
{
        list<Type>& whichList=theLists[myHash(val)];

        if(find(whichList.begin(),whichList.end(),val)!=whichList.end())
                return false;

        whichList.push_back(val);

        if(++currentSize>theLists.size())
                rehash(); // 装载因子超过了1,将其复制到另外一个
       size()更大的哈希表中,rehash()函数下面会给出

        return true;
}

3:查找某一个元素是否已经包含在该哈希表中:

template<class Type>
bool HashTable<Type>::contains(const Type& val) const
{
        const list<Type>& whichList=theLists[myHash(val)];
//      if(find(whichList.begin(),whichList.end(),val)!=whichList.end())
//              return true;
//      return false;
        return find(whichList.begin(),whichList.end(),val)!=whichList.end();
}

4:删除操作

template<class Type>
bool HashTable<Type>::remove(const Type& val)
{
        list<Type>& whichList=theLists[myHash(val)];

        typename list<Type>::iterator it=find(whichList.begin(),whichList.end(),val);
        if(it==whichList.end())
                return false;

        whichList.erase(it);
        --currentSize;
        return true;
}

5:如果该哈希表中装载因子达到某一个值后,就不能再插入元素了,如果还要再插入元素,就将其散列到另外一个哈希表中

template<class Type>
void HashTable<Type>::rehash()
{
        vector<list<Type> > oldLists=theLists;
        theLists.resize(nextPrime(2*theLists.size()));

        for(typename vector<list<Type> >::size_type ix=0;ix!=theLists.size();ix++)
                theLists[ix].clear();
        currentSize=0;

        for(typename vector<list<Type> >::size_type ix=0;ix!=oldLists.size();ix++)
                for(typename list<Type>::const_iterator it=oldLists[ix].begin();it!=oldLists[ix].end();it++)
                        insert(*it);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

散列表的详细剖析 (算法导论第11章)

注意:   ① 由同一个散列函数、不同的解决冲突方法构造的散列表,其平均查找长度是不相同的。   ② 散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。因此在设计散列表时可选择α以控制散...
  • LuckyJune34
  • LuckyJune34
  • 2015年07月08日 14:45
  • 1499

算法导论-第11章-散列表

转自:http://blog.csdn.net/mishifangxiangdefeng/article/details/7713307 一、概念 1.综述 散表表仅支持INSERT、SEA...
  • u012243115
  • u012243115
  • 2014年10月31日 08:13
  • 414

算法导论 第11章 散列表

散列表是主要支持动态集合的插入、搜索和删除等操作,其查找元素的时间在最坏情况下是O(n),但是在是实际情况中,散列表查找的期望是时间是O(1),散列表是普通数组的推广,因为可以通过元素的关键字在数组对...
  • LucienDuan
  • LucienDuan
  • 2014年08月26日 12:03
  • 1100

快学scala 第十一章 操作符 读书笔记及习题答案代码

chapter 11 操作符 标签:快学scala 一、笔记 scala种可以在反引号中包含几乎任何字符序列, val 'val' = 42 所有的操作符都是左结合的...
  • refuil
  • refuil
  • 2016年07月22日 09:22
  • 1163

Python编写一些小玩意儿(《Python核心编程》第11章)

本人理科学生狗,本科时抱着自己以后绝不会从事计算机相关工作的态度而对编程敬而远之,大一学习C++也是苦不堪言,期末背背书上的代码,勉强及格,大二之后再也没有碰过。 对于我这样一个编程菜鸟来说,Pyt...
  • zuolixiangfisher
  • zuolixiangfisher
  • 2015年07月05日 16:35
  • 215

《算法导论》第11章 散列表 (2)散列表

用散列表来解决直接寻址表的那两个问题。但由此带来的散列值的碰撞问题。 最简单的解决方法是链接法,以及下一节介绍的开放寻址法。 链接法,即把散列到同一槽中的所有元素都放在一个链表中。 链表...
  • dc_726
  • dc_726
  • 2012年03月10日 23:05
  • 1907

机器学习(周志华) 参考答案 第十一章 特征选择与稀疏学习 11.1

机器学习(周志华) 参考答案 第十一章 特征选择与稀疏学习 11.1 机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article...
  • icefire_tyh
  • icefire_tyh
  • 2016年08月19日 22:10
  • 1031

算法导论第11章 散列表(哈希表)

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详...
  • u014627487
  • u014627487
  • 2015年01月15日 17:44
  • 348

《算法导论》 第11章部分答案

注:以下答案均为自己思考,难免有误,欢迎指正。 11.3-1: 将长度为n的链表进行排序,将关键值的散列值相同的元素排为相邻。而散列表有点类似于链接法解决冲突的散列表。 11.3-2: 一个字符的A...
  • zyz394515661
  • zyz394515661
  • 2015年09月16日 18:23
  • 904

《Python核心编程》第11章 习题

11-2 函数。结合你对练习5-2的解,以便你创建一个带一对相同数字并同时返回它们之和以及产物的结合函数。 fun=lambda x,y:x+y print fun(1,3) 11-3 函数...
  • birdzb
  • birdzb
  • 2016年01月22日 16:15
  • 3035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第11章:散列表
举报原因:
原因补充:

(最多只允许输入30个字)