'''
哈希表 字典和集合一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作:
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算法
# 比特币系统

链表实现哈希表以及哈希表的应用相关推荐

  1. 数据结构几个最简单的阐述完整版(带你入门:链表,栈,队列,哈希表,树)通俗易懂简单明了

    数据结构几个最简单的阐述完整版 一.链表(Linked list): 如下图是一个链表: 1.链表是无须存储在连续的空间内,一般都是分散存储于内存中.(指针是指向下一个数据的内存地址) 2.所有要访问 ...

  2. 数据结构-链表、队列、栈、哈希表

    数据结构指的是任意长度.类型的数据对应的字节在内存中的存放结构.内存存储单元的最小单位是Byte,内存物理上是连续的.无差别的.但是软件可以通过不一样的使用方式来填充.操作内存.例如数组中,数据是顺序 ...

  3. python 哈希表_哈希表哪家强?编程语言找你来帮忙!

    点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自编程技术宇宙 哈希表华山论剑 比特宇宙编程语言联合委员会准备举办一次大会,主题为哈希 ...

  4. 【Python算法】哈希存储、哈希表、散列表原理

    哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...

  5. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  6. 哈希表及哈希冲突解决办法

    哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...

  7. 除留余数法构造哈希表_哈希表算法原理

    基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构.通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数. 哈 ...

  8. 哈希表及哈希表查找相关概念(转)

    1. 哈希表的概念 对于动态查找表而言,1) 表长不确定:2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字.因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的 ...

  9. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

    哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...

最新文章

  1. 自定义FireFox浏览器滚动条
  2. putty network error: connection refused
  3. OFBiz + Opentaps 目录管理 十三. 配置产品搜索
  4. 资源隔离之 Linux namespace
  5. C语言之去掉https链接的默认443端口
  6. 提取json对象中的数据,转化为数组
  7. linux下openldap版本查询,用openldap进行linux认证
  8. java模拟数据库压测_Jeecgboot Feign、分布式压测、分布式任务调度
  9. (24)FPGA面试题3分频器
  10. OpenCV中将RGB数组在内存中压缩成JPEG文件
  11. linux挂载windows上的共享文件夹
  12. Atitit 避税之道 如何降低企业与项目组成本 attilax总结
  13. python 对象转json
  14. 2020程序设计竞赛-现场赛题解
  15. UNIX v6 fork()源码分析
  16. SpringCloudConfig分布式配置中心介绍与搭建使用以及ConfigClient实现动态刷新配置
  17. 【OpenJudge】白细胞计数
  18. NandFlash和iNand
  19. Android之指纹解锁
  20. Apache Tomcat安装和配置(Windows环境xia)

热门文章

  1. python数据分析兼职网上接单_python数据分析兼职网上接单
  2. Java:根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)
  3. 高精度计算PI值 C语言 思路,高精度计算PI值
  4. 互联网科普-什么是天猫
  5. 360 DNS安全白皮书
  6. SQL Server 删除数据库报错 Cannot drop database dbname because it is currently in use
  7. 浅谈js原型和原型链
  8. 超越三星,华为再与苹果演绎智能手表江湖
  9. mysql函数如何调用过程_MySQL调用存储过程和函数
  10. 安卓系统手机软件_黑科技!让你的系统再安装一个系统,实现ROOT和XP自由