【数据结构】回顾散列表
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
【数据结构】回顾散列表相关推荐
- 数据结构之散列表(七)
前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...
- 数据结构四——散列表(上)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...
- 数据结构四——散列表(下)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...
- 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...
散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...
- 数据结构(55) 散列表(哈希表,hash table,hash map)
目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...
- 【数据结构】散列表知识点
散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...
- 大话数据结构:散列表
基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...
- 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)
散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...
- Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
最新文章
- mysql连接hang住问题分析
- 普元王葱权:数字化时代需要新一代的大数据应用平台架构
- Java 条件解析,Java Lambda使用条件检查解析集合
- 读源码,对开发者重要吗?
- 忘记 mysql 密码的取回方法
- Windows服务器学习篇:服务器连接与退出
- I/O复用函数的比较
- 想做测试工程师,这7件事你必须先知道
- Python之旅Day6 模块应用
- Markdown编辑LaTeX数学公式
- Flutter学习 — 实现滑动关闭、删除item
- TCPreplay libdnet安装失败情况下安装/tcpreplay yum install 方式安装
- dnf 服务器每周维护,DNF:7.22官方公告出炉,凌晨2点维护7小时,新增3个活动有玄机?...
- c语言10迷宫,C语言实现走迷宫
- P1164 小A点菜(DP动态规划,洛谷,java)
- 虚拟主机选择_为何云虚拟主机我选择了,但企业还是不能更好地开展网站建设呢?...
- jsjsjsjsjssjsjsjs
- OPenCV imread()函数第二个参数详解
- 数位DP 学习笔记1(数位DP入门)
- 程序员应对35岁中年危机的措施
热门文章
- Learun FrameWork 强大工作流引擎,让OA更智能
- linux新内核的freeze框架以及意义
- ERP系统为什么要使用集成的数据和信息平台?
- 编译hadoop2.2.0源码时报错
- ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据
- .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
- Silverlight Gantt轻量级高性能的甘特图
- nginx rewrite 参数和例子
- XML与Webservices相关的安全问题概述
- CISSP备考系列之行政性管理[10-37]