哈希函数

通过哈希表可以实现 O(1) 复杂度的查找。

哈希函数构造方法:设计好的哈希函数的两个基本原则,计算简单+分布均匀

1. 直接定址法

  用key自身的某个线性函数来定址,f(key) = a*key + b。但需要知道关键字的分布情况。

2. 数字分析法

  适合处理关键字位数比较大的情况。抽取关键字的一部分作为哈希地址。

3. 平方取中法

  将key平方后取中间若干位数字作为哈希地址。

4. 折叠法

  将key分为位数相等的几个部分,将这几部分叠加求和,按哈希表表长取后几位作为哈希地址。

5. 除留余数法

  最常用。对哈希表长为m,f(key) = key mod p ,p小于等于m。p的选择非常重要,选的不好可能造成哈希冲突。

处理哈希冲突的方法:key1 != key2 但 f(key1) == f(key2),哈希冲突。

1. 开放定址法:一旦发生冲突,就去找下一个空的哈希地址,只要哈希表足够大,总能找到空的哈希地址。

  fi(key) = (f(key)+di) mod p,di = 1, 2, ..., p-1     线性探测法。

  直接这样取值di比较盲目,可以通过修改di的取值方式,例如平方运算,来尽量解决堆积问题,二次探测法。

  fi(key) = (f(key)+di) mod p,di = 12, -12, 22, -22 , ..., q2, -q2 ;q<=p/2

  或者直接用随机函数来取值di,称之为随机探测法。

  fi(key) = (f(key)+di) mod p,di是由随机函数产生的序列。

2. 再哈希函数法,准备多个哈希函数,当出现冲突的时候,调用下一个哈希函数进行计算。最后还是出现冲突的可能很低。

3. 链地址法(拉链法),常用方法。利用单链表,哈希表存的不是记录元素,而是记录的地址,如果出现冲突,就从前面的记录再链到冲突的元素即可。

4. 公共溢出区法,对于冲突的记录单独用溢出表连续存储,如果哈希搜索不到,就去溢出区中找。对于一个比较优秀的哈希函数,这种方法解决冲突的效率较高。

List:实现方式可以是数组也可以是链表,元素可重复。插入O(1),查找O(n)。

Map:key-value对构成,键key不重复。

Set:不允许有重复元素。用哈希表(或二叉树)来实现,所以查找O(1) 复杂度(或O(logn))。

用哈希表实现,元素排列乱序,查找O(1);用二叉搜索树实现,元素排列相对有序,查找O(logn)。

各语言中的 hashmap :

各语言中的 hashset:

映射&集合的更多相关文章

  1. 6.1 集合和映射--集合Set->底层基于二叉搜索树实现

    前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...

  2. (转)Hibernate框架基础——映射集合属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合 ...

  3. Hibernate映射集合属性

    Hibernate要求持久化集合属性字段必须声明为接口,实际的接口可以是java.util.Set,java.util.Collection,java.util.List,java.util.Map, ...

  4. 1-6 hibernate映射集合属性

    1.集合类框架 以Tree开头都是按顺序,默认情况下是升序排列. 以Linked 开头的都是按插入顺序排列的. 2.在hibernate中要持久化集合属性时必须将其声明为接口,如 private Se ...

  5. 6.2 集合和映射--集合Set->底层基于链表实现

    在6.1中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于链表实现进行学习,注意:此处的链表是之前自己封装的. 1.集合set相关功能 1.1 add()的不同 用于链表本身没有去重的效果,因此 ...

  6. Hibernate第四篇【集合映射、一对多和多对一】

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...

  7. mybatis ---- 级联查询 一对多 (集合映射)

    关联有嵌套查询和嵌套结果两种方式,本文是按照嵌套结果这种方式来说明的 上一章介绍了多对一的关系,用到了<association></association>,这是一个复杂类型的 ...

  8. 【Hibernate步步为营】--最后的集合映射

    上篇文章具体讨论了组合对象映射的原理.它事实上指的是怎样将对象模型中的组合关系映射到关系模型中,它是通过使用Hibernate提供的<component>标签来实现的,并须要在该标签中加入 ...

  9. 集合映射Set(使用xml文件)

    如果持久类具有Set对象,可以在映射文件中使用set元素映射Set集合. set元素不需要索引元素. List和Set之间的区别是: Set只存储唯一的值. 我们来看看我们如何在映射文件中实现集合: ...

随机推荐

  1. 微信小程序注册流程

    响应公司号召,跟上时代潮流,接下来我将独自开发微信小程序,接下来我介绍下注册流程,后续会补上小程序开发心得. 注册流程 注册之前,需要使用一个邮箱,该邮箱作为登录小程序的账号,这个邮箱不能被微信开放平 ...

  2. [转]sublime text3在指定浏览器上本地服务器(localhost)运行文件(php)

    昨天在使用sublime text3时,发现能在本地服务器上运行php文件,于是百度了一下有关知识, 终于成功了,今天总结一下. 首先要让sublime text3 出现侧边栏sidebar,不会的可 ...

  3. c# override用法

    要扩展或修改继承的方法.属性.索引器或事件的抽象实现或虚实现,必须使用 override 修饰符. 在此例中,类 Square 必须提供 Area 的重写实现,因为 Area 是从抽象的 Shapes ...

  4. H5学习笔记-应用缓存,Web worker,服务器发送事件

    ↑亮了 应用缓存用法 <!DOCTYPE HTML> <html manifest="demo.appcache"> <body> The co ...

  5. Java web导出word,文件名为中文,%E6%9D%90%E8%B4%A8%E5%8D%95乱码

    因为文件名为中文,导出时会有乱码问题 原代码: String fileName = "文件名.doc"; response.setHeader("Content-Disp ...

  6. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  7. AKKA 集群中的发布与订阅Distributed Publish Subscribe in Cluster

    Distributed Publish Subscribe in Cluster 基本定义 在单机环境下订阅与发布是很常用的,然而在集群环境是比较麻烦和不好实现的: AKKA已经提供了相应的实现,集群 ...

  8. 【深搜(DFS)-例题-踏青】-C++

    描述 小白和他的朋友周末相约去召唤师峡谷踏青.他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地.草丛通过上下左右 4 个方向扩展其他草丛形成一片草地,任何一片草地中的格子都 ...

  9. 【最小生成树之Prim算法】-C++

    [最小生成树之Kruskal算法] 没有看过的可以先看↑,会更简单. [模板]最小生成树 这一篇博客主要是介绍另外一种算法:Prim算法. prim算法就好像是一棵"生成树"在慢慢 ...

  10. python基础知识四 小数据池,深浅拷贝,集合+菜中菜

    四.小数据池,深浅拷贝,集合+菜中菜 1小数据池 --缓存机制(驻留机制) ​ '==' 判断两边内容是否相等 ​ 'is' 基于内存地址进行判断是否相同 a = 10 b = 10 print(a ...