1.散列表(hash table)的实现成为散列(hashing),是一种以常数平均时间执行输入、删除和查找的技术。但是那些需要元素间任何排序信息的数操作将不会得到有效的支持。

2.散列函数示例

int hash(const string & key, int tableSize)
{int hashVal=0;for(int i=0;i<key.length();i++)hashVal=37*hashVal+key[i];hashVal %= tableSize;if(hashVal<0)hashVal+=tableSize;return hashVal;

3.散列表是由键值对来提供动力的,因此如果在值相同而键不同的情况下就会发生冲突。那么解决冲突的办法,有一种叫做分离链接法(separate chaining),它将散列到同一个值得所有元素都保留到一个链表中。

分离链接散列表的类构架:

template <typename HashedObj>
class HashTable
{
public:explicit HashTable(int size=101);bool contains(const HashedObj & x) const;void makeEmpty();void insert(const HashedObj & x);void remove(const HashedObj & x);private:vector<list<HashedObj>> theLists;int currentSize;void rehash();int myhash(const HashedObj & x) const;
};int hash(const string & key);
int hash(int key);
int myhash(const HashedObj & x) const
{int hashVal=hash(x);hashVal %= theLists.size();if(hashVal<0)hashVal+=theLists.size();return hashVal;
}

4.分离链接散列表的insert函数

bool insert(const HashedObj & x)
{list<HashedObj> & whichList=theLists[myhash(x)];if(find(whichList.begin(),whichList.end(),x)!=whichList.end())return false;whichList.push_back(x);if(++currentSize>theLists.size())rehash();return true;
}

5.分离链接散列表算法的缺点是使用了一些链表,由于给新单元分配地址需要时间,因此这就导致算法的速度有些减慢,同时算法实际上还要求第二种数据结构的实现。因此探测散列表就应运而生。它又包含了3种探测方式。

线性探测

平方探测

双散列

6.如果散列表已经不足以来存放你的数据,那么可以考虑使用可扩散列(extendible hashing)。

7.对于分散链接散列法,虽然装填因子不大时性能并不明显降低,但装填因子还是应该接近于1.对于探测散列,除非完全不可避免,否则装填因子不应该超过0.5.如果用线性探测,那么性能随着装填因子接近于1而急速下降。再扩散运算可以通过使表增长和收缩来保持合理的装填因子。



感谢您的访问,希望对您有所帮助。

欢迎大家关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


【数据结构】回顾散列表相关推荐

  1. 数据结构之散列表(七)

    前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...

  2. 数据结构四——散列表(上)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...

  3. 数据结构四——散列表(下)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...

  4. 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...

    散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...

  5. 数据结构(55) 散列表(哈希表,hash table,hash map)

    目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...

  6. 【数据结构】散列表知识点

    散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...

  7. 大话数据结构:散列表

    基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...

  8. 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

    散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...

  9. Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现

    分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...

最新文章

  1. mysql连接hang住问题分析
  2. 普元王葱权:数字化时代需要新一代的大数据应用平台架构
  3. Java 条件解析,Java Lambda使用条件检查解析集合
  4. 读源码,对开发者重要吗?
  5. 忘记 mysql 密码的取回方法
  6. Windows服务器学习篇:服务器连接与退出
  7. I/O复用函数的比较
  8. 想做测试工程师,这7件事你必须先知道
  9. Python之旅Day6 模块应用
  10. Markdown编辑LaTeX数学公式
  11. Flutter学习 — 实现滑动关闭、删除item
  12. TCPreplay libdnet安装失败情况下安装/tcpreplay yum install 方式安装
  13. dnf 服务器每周维护,DNF:7.22官方公告出炉,凌晨2点维护7小时,新增3个活动有玄机?...
  14. c语言10迷宫,C语言实现走迷宫
  15. P1164 小A点菜(DP动态规划,洛谷,java)
  16. 虚拟主机选择_为何云虚拟主机我选择了,但企业还是不能更好地开展网站建设呢?...
  17. jsjsjsjsjssjsjsjs
  18. OPenCV imread()函数第二个参数详解
  19. 数位DP 学习笔记1(数位DP入门)
  20. 程序员应对35岁中年危机的措施

热门文章

  1. Learun FrameWork 强大工作流引擎,让OA更智能
  2. linux新内核的freeze框架以及意义
  3. ERP系统为什么要使用集成的数据和信息平台?
  4. 编译hadoop2.2.0源码时报错
  5. ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据
  6. .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
  7. Silverlight Gantt轻量级高性能的甘特图
  8. nginx rewrite 参数和例子
  9. XML与Webservices相关的安全问题概述
  10. CISSP备考系列之行政性管理[10-37]