当前位置: 首页 > news >正文

网站开发公司网站免费个人网站空间

网站开发公司网站,免费个人网站空间,做深度的互联网站,app网站建设教程视频Set集合, 不能重复,不能修改,顺序无关,可以直接遍历(实现了 Iterable接口) Map 映射表, 键值对 key - value 随时根据 key 找到对应的 value, 针对 key,也要求不能重复,不能修改,顺序无关.对 value 也无要求 put 插入新的键值对/键已经存在,修改 value get 根据 key 获取到 v…

Set集合, 不能重复,不能修改,顺序无关,可以直接遍历(实现了 Iterable接口)

Map 映射表, 键值对  key - value

        随时根据 key 找到对应的 value, 针对 key,也要求不能重复,不能修改,顺序无关.对 value 也无要求

        put 插入新的键值对/键已经存在,修改 value

        get 根据 key 获取到 value ,如果 key 不存在,返回 null

        不可以直接遍历, 想要遍历就把 Map 转成 entrySet

Map 和 Set 都是有两种实现的

        TreeMap/TreeSet => 二叉搜索树

        HashMap/HashSet => 哈希表

哈希表

1.工作中最常用

2.面试中最常考

虽然 Set 和 Map 提供了两种实现,实际上 Tree 系列使用的频率非常少,主要都是 Hash 系列

二叉搜索树,目的是为了高效的查找,对于红黑树这样的平衡二叉搜索树, 查询的时间复杂度O(logN)

哈希表这个数据结构,也是高效查找,查找的时间复杂度O(1),插入时间复杂度,也是O(1)

场景:给定一个整型数组(任意长度),约定这个数组里面的元素的范围是 0 - 99, 统计这个数组中 每次数字,出现的次数

其实可以通过"键值对"这样的方式来表示完成的

把每个要统计的数字,作为"键"

该数字出现的次数,作为"值"

如果不使用键值对的方案,还有另一个办法,使用数组

int[] arr = new int[100]

使用数组下标表示要统计的整数是啥, 数组的元素,表示该下标出现的次数

如果这个数据的范围更大?

如果这个数据里面存在负数/小数?

如果这个数据里面存在字符串?

需要有一系列的手段,把要表示的元素,进行转换到数组的下标上(这个转换过程,称为"哈希函数")

如果任意的 int -21亿 => +21亿, 通过一系列数学变化,把这个 int 映射到一个相对较小的数组下标上,不需要创建 int[] count = new int[42亿],只创建一个 new int[10000](这样的用来表示映射关系的数组就称为 哈希表)

哈希表 O(1) 的奥秘,在于核心操作,就是数组访问下标.哈希函数(原始的值 => 下标转换过程)通常也是 O(1)根据下标进行增删改查,也是O(1)

此处存在"空间不对等"问题.如果要存储的是任意整数,范围 42亿个.此时要创建的保存的数据的数组,范围 1w 个,此时,一定存在重复,两个不同的数据,映射到同一个数组下标上了(哈希冲突)

举个具体的例子: 对于 key 为整数来说, 一个常见的 hash 函数的设计方式, 直接求余数

key 的范围是 0 => 42亿

哈希表的数组长度是 1w

        hash函数 => key % 1w

        10001

        20001

        30001

        都映射到下标为 1

哈希表设计中的一个关键要点,如何解决哈希冲突

哈希冲突的解决方案:

1.闭散列

这个过程"线性探测", 挨着一个一个的往后找空闲位置

此时来了一个数字 10001 % 1w => 1

此时再来一个数字 20001 % 1w => 1 发现下标 1 不在空闲,就继续往后找,找到空闲位置

如果再来一个数字 30001 % 1w => 1 发现下标 1 不在空闲,发现 下标 2 也不空闲,就找到下标 3 就放到下标 3 上

如果在来一个 30002 % 1w => 发现下标为 2 不空闲, 下标 3 不空闲,放到下标 4 上

还可以采取其他的往后找的方式,不过闭散列 这样的方案,基本上没有实用价值, 开发中真实实用的哈希表没有用闭散列

2.开散列

会确保哈希函数计算的下标是准确位置, 使用一个链表,保存"冲突"的元素, 此时,这个数组的每个元素,都是"链表节点"

计算 哈希函数,任然是O(1)

        但是如果进行查找/删除,就有可能会遍历这个链表...这个时候,时间复杂度还是O(1)吗?

        可以通过一些手段,限制链表的最大长度(虽然是链表,但是长度非常短)

        此处的链表,不是"长度为N" 的链表,而是有限长度的链表

负载因子 = 整个哈希表保存的元素个数 / 数组的长度 (相当于链表的平均长度)

        实践中可以根据负载因子,设定阈值,随着哈希表元素个数的增加,使得哈希表元素个数增加,使得负载因子到达阈值,就会自动触发扩容操作

哈希表,本质上是利用了数组下标操作比较高效的特点,实现的一个数据结构.通过哈希表,把要保存的内容,映射到数组下标上.如果出现冲突,在开散列的方式,来解决冲突(哈希表的设定是一个数学问题)

对于 Java 标准库的 HashMap 来说,还有一些额外的优化手段

扩容,本身也是有一定成本的(大量的元素的拷贝),尤其是,还可能会出现一些极端的情况.比如,整体链表的平均长度不是很长,在阈值之下,但是个别的链表长度特别长(小概率)

Java 的 HashMap 会在元素往链表上插入的时候 做一个判定,判定如果当前链表达到一定的值,就直接把链表转化成 红黑树

HashMap 标准库中 ,要求 0.75 就要触发扩容

http://www.15wanjia.com/news/51970.html

相关文章:

  • 国内做焊接机器人平台网站网站整体优化
  • 外国法院网站建设seo关键词排名系统
  • 上海网站制作多少钱站长统计app进入网址
  • 论坛网站建设需要多少钱网上推广怎么收费
  • 小程序致美发型设计seo黑帽教学网
  • 万网主机 网站重做黑科技引流推广神器
  • 网页回合制游戏排行榜长沙优化网站
  • 帮别人做网站的公司是外包吗公司网站推广技巧
  • 做钓鱼网站盗游戏号会被判刑吗网站内容优化怎么去优化呢
  • 网站开发支持二次开发广告营销策略有哪些
  • 自己做网站做那种类型如何提高百度搜索排名
  • 衡阳衡阳县网站建设网推怎么推广
  • 衡水建设企业网站长沙seo
  • dw做的网站不显示软文广告
  • 什么在线做动图的网站比较好建网站需要什么
  • 为什么做这个网站反馈问题武汉服装seo整站优化方案
  • 网站备案需要去哪里品牌营销策划怎么写
  • wordpress修改媒体库的路径为相对路径关键词优化需要从哪些方面开展
  • 英文免费注册网站百度关键词快速排名方法
  • 中国证券监督管理委员会公告seo的主要内容
  • 广州邮局网站搭建网站基本步骤
  • 定西网站建设商务软文写作范文200字
  • 广州做网站优化费用百度推广一天费用200
  • 旅游网站开发报价单百度搜索指数查询
  • 广州学习做网站建设的学校网络营销策划ppt范例
  • 做网站要用到数据库吗网页设计模板素材图片
  • 网站什么时候做等保西安seo全网营销
  • 单纯python能完成网站开发吗推广的软件有哪些
  • 时尚工作室网站源码汽车网站建设方案
  • 昆明企业建网站多少钱网站申请流程