MySQL中哈希表
也称为散列表 由直接寻址表改进而来.先看直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。加入某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,...,m-1}的关键字。同时假设没有两个元素具有相同的关键字
用一个数组(即直接寻址表)T[0...m-1]表示动态集合,其中每个位置(或称槽或桶)对应全域U中的一个关键字。图5-38说明了这个问题。槽K指向集合的一个关键字为k的元素。如果该集合没有关键字k的元素,则T【k】=NULL

直接寻址存在一个很明显的问题。如果域U很大,在一台典型计算机的可用容量的限制下,要在机器中存储大小为U的一张表T就有点不太实际,甚至不太可能。如果实际要存储的关键字集合K相对U来说很小,那么分配给T的大部分空间都要浪费掉
因此,哈希表出现了,在哈希方式下,该元素处于h(k)中,即利用哈希函数h,根据关键字k计算出槽的位置,函数h将关键字域U映射到哈希表T[0...m-1]的槽位中,如果5-39所示

哈希表技术很好的解决了直接寻址遇到的问题。但是这样还是有个小问题。如图5-39中所示两个关键字可能映射到同一个槽上。一般将这种情况称之为发生了碰撞。在数据库总一般采用最简单的碰撞解决技术,这种技术被称为链接法
在链接法中,把散列到同一槽中的所有元素都放在一个链表中,如果5-40所示,槽j中有一个指针,它指向所有散列到j的元素构成链表的头。如果不存在这样的元素,那么j为NULL

最后要考虑的是哈希函数,哈希函数h必须可以很好的散列,最好的情况是能避免碰撞发的发生。即使不能避免,也应该使碰撞在最小的成都下产生。一般来说,都将关键字转换成自然数,然后通过除法散列、乘法散列或全域散列来实现。数据库中一般采用触发散列的方法
在哈希函数的除法散列算法中,通过取k除于m的余数,将关键字k映射到m个槽的某一个去,即哈希函数为
h(k)=k mode m
MySQL中哈希表的更多相关文章
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- mysql中把一个表的数据批量导入另一个表中
mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...
- js中哈希表的几种用法总结
本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- [转]net中哈希表的使用 Hashtable
本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...
- C#中哈希表与List的比较
简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有 ...
- C++ STL中哈希表Map 与 hash_map 介绍
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
- MySQL中的联结表
使用联结能够实现用一条SELECT语句检索出存储在多个表中的数据.联结是一种机制,用来在一条SELECT语句中关联表,不是物理实体,其在实际的数据库表中并不存在,DBMS会根据需要建立联结,且会在查询 ...
随机推荐
- js中的 return false;
总的来说return false 的作用就是阻止事件的默认行为 1. function check() { if(form.title.value=="") { alert(&qu ...
- 【private HibernateTemplate template;】 的作用
[private HibernateTemplate template;] 的作用 这个是在spring中定义了一个bean,它是org.springframework.orm.hibernate3. ...
- HDU 4421 Bit Magic(2-sat)
HDU 4421 Bit Magic pid=4421" target="_blank" style="">题目链接 题意:就依据题目,给定b数 ...
- WIN10系统如何设置系统的护眼色
小编的眼神不是很好,所以喜欢把电脑的各种文档的背景色设置成护眼色(就是在视觉效果看起来非常舒适的那种淡绿色) 方法/步骤 windows+R键调出运行窗口(或者鼠标右击开始键,选择运行) ...
- memcached 命令行举例
1.启动Memcache 常用参数 memcached 1.4.3 -p <num> 设置端口号(默认不设置为: 11211) -U <num> UDP监听端口 (默 ...
- Atitit.atijson 类库的新特性设计与实现 v3 q31
Atitit.atijson 类库的新特性设计与实现 v3 q31 1. V1版本---集成了多引擎1 2. V2版本新特性 --bsh脚本化2 3. V3版本新特性---循环引用解决使用fastjs ...
- Atitit..net clr il指令集 以及指令分类 与指令详细说明
Atitit..net clr il指令集 以及指令分类 与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具 ...
- _T("") vs L 到底用谁?L!
一直没有注意这个,今天突然纠结起来这个问题,代码写多了,难免这两个混用. 现在是时候有个结论了: 如果你的工程是unicode编译,那么请明确的使用L! 如果是多字节(ansi),那么请使用_T(&q ...
- C++避免内存泄漏的一种技巧
C++ Primer 4th中在section 13.5中的U_Ptr就是一种实用的例子 通过计数的方式,并提供自己的抽象类型的Pointer,从而实现内存管理.在一定的范围内还是非常有效的,比如说在 ...
- iOS: 与 insertRowsAtIndexPaths 在 UITableview 中插入多个行
我有 10 行已经在连接中想做什么添加另一个 10 行,我使用的 insertRowsAtIndexPaths,但我要的错误. 以下是我使用的代码 -(void)insertDownloadedAct ...