链表实现哈希表以及哈希表的应用
'''
哈希表 字典和集合一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作:
insert:插入键值对
get :如果存在键为key的键值对则返回其value,否则返回空值
delete:删除键为key的键值对直接寻址表
关键字的全域U比较小时,一种简单而又有效的方法缺点:
当域U很大,需要消耗大量内存
当域U很大,实际出现的key很少,
无法处理关键字不是数字的情况直接寻址表:key为k的元素放在k位置上
哈希:构建大小为m的寻址表Tkey为k的元素放在h(k)位置上h(k)是一个函数,其将域U映射到表T[0,1,...,m-1]哈希表(散列表):是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标假设有一个长度为7的哈希表,哈希函数h(k) = k%7(除法哈希).元素集合{14,22,3,5}的存储方式如图14->0位置(14%7 = 0)22->1位置(22%7 = 1)3->3位置(3%7 = 3)5->5位置(5%7 = 5)哈希冲突:0->0位置0位置冲突由于哈希表的大小是有限的,而要存储的值的总数量是无限的,因此对于任何哈希函数,都会出现两个不同的元素映射到同一个位置上的情况,这种情况叫做哈希冲突解决方法:
开放寻址法: 如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值线性探查:如果位置i被占用,则探查i+1,i+2,....直至找到一个位置二次探查:如果位置i被占用,则探查i+1**2,i-1**2,i+2**2,i-2**2,.....二度哈希:有n个哈希函数,当使用第一个哈希函数h1发生冲突时,则尝试使用h2,h3,......拉链法:哈希表每一个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后常见的哈希函数:除法哈希:h(k) = k % m乘法哈希:h(k) = floor(m*(A*key%1))A 是一个任意值,m是大小,floor 是向下取整全域哈希法:h(a,b)(k) = ((a*key + b) mod p )mod m a,b = 1,2,...,p-1mod 就是 % 取模 (a,b)是下标'''# 哈希表的实现# 定义一个链表类
class LinkList:class Node:def __init__(self, item=None):self.item = itemself.next = Noneclass LinkListIterator:def __init__(self, node):self.node = nodedef __next__(self):if self.node:cur_node = self.nodeself.node = cur_node.nextreturn cur_node.itemelse:raise StopIterationdef __iter__(self):return selfdef __init__(self, iterable=None):self.head = Noneself.tail = Noneif iterable:self.extend(iterable)def append(self, obj):s = LinkList.Node(obj)if not self.head:self.head = sself.tail = selse:self.tail.next = sself.tail = sdef extend(self, iterable):for obj in iterable:self.append(obj)def find(self, obj):for n in self:if n == obj:return Trueelse:return Falsedef __iter__(self): # 迭代器return self.LinkListIterator(self.head)def __repr__(self): # 转换成字符串return "<<" + ",".join(map(str, self)) + ">>"# lk = LinkList([1,2,3,4,5])
# for element in lk:
# print(element)# 类似于集合的结构
class HashTable:def __init__(self, size=100):self.size = sizeself.T = [LinkList() for i in range(self.size)]def h(self, k):return k % self.sizedef find(self, k):i = self.h(k)return self.T[i].find(k)def insert(self, k):i = self.h(k)if self.find(k):print("重复插入!!")else:self.T[i].append(k)ht = HashTable()ht.insert(0)
ht.insert(1)
ht.insert(3)
ht.insert(102)
ht.insert(508)
print(",".join(map(str, ht.T)))print(ht.find(22))# 哈希表的应用
# 字典与字典# MD5算法
# 文件拥有哈希值
# SHA2算法
# 比特币系统
链表实现哈希表以及哈希表的应用相关推荐
- 数据结构几个最简单的阐述完整版(带你入门:链表,栈,队列,哈希表,树)通俗易懂简单明了
数据结构几个最简单的阐述完整版 一.链表(Linked list): 如下图是一个链表: 1.链表是无须存储在连续的空间内,一般都是分散存储于内存中.(指针是指向下一个数据的内存地址) 2.所有要访问 ...
- 数据结构-链表、队列、栈、哈希表
数据结构指的是任意长度.类型的数据对应的字节在内存中的存放结构.内存存储单元的最小单位是Byte,内存物理上是连续的.无差别的.但是软件可以通过不一样的使用方式来填充.操作内存.例如数组中,数据是顺序 ...
- python 哈希表_哈希表哪家强?编程语言找你来帮忙!
点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自编程技术宇宙 哈希表华山论剑 比特宇宙编程语言联合委员会准备举办一次大会,主题为哈希 ...
- 【Python算法】哈希存储、哈希表、散列表原理
哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...
- 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶
文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...
- 哈希表及哈希冲突解决办法
哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...
- 除留余数法构造哈希表_哈希表算法原理
基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 哈 ...
- 哈希表及哈希表查找相关概念(转)
1. 哈希表的概念 对于动态查找表而言,1) 表长不确定:2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字.因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的 ...
- ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法
哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...
最新文章
- 自定义FireFox浏览器滚动条
- putty network error: connection refused
- OFBiz + Opentaps 目录管理 十三. 配置产品搜索
- 资源隔离之 Linux namespace
- C语言之去掉https链接的默认443端口
- 提取json对象中的数据,转化为数组
- linux下openldap版本查询,用openldap进行linux认证
- java模拟数据库压测_Jeecgboot Feign、分布式压测、分布式任务调度
- (24)FPGA面试题3分频器
- OpenCV中将RGB数组在内存中压缩成JPEG文件
- linux挂载windows上的共享文件夹
- Atitit 避税之道 如何降低企业与项目组成本 attilax总结
- python 对象转json
- 2020程序设计竞赛-现场赛题解
- UNIX v6 fork()源码分析
- SpringCloudConfig分布式配置中心介绍与搭建使用以及ConfigClient实现动态刷新配置
- 【OpenJudge】白细胞计数
- NandFlash和iNand
- Android之指纹解锁
- Apache Tomcat安装和配置(Windows环境xia)
热门文章
- python数据分析兼职网上接单_python数据分析兼职网上接单
- Java:根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)
- 高精度计算PI值 C语言 思路,高精度计算PI值
- 互联网科普-什么是天猫
- 360 DNS安全白皮书
- SQL Server 删除数据库报错 Cannot drop database dbname because it is currently in use
- 浅谈js原型和原型链
- 超越三星,华为再与苹果演绎智能手表江湖
- mysql函数如何调用过程_MySQL调用存储过程和函数
- 安卓系统手机软件_黑科技!让你的系统再安装一个系统,实现ROOT和XP自由