递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 3780|回复: 5
打印 上一主题 下一主题

[视窗] 请问无序哈希集是什么意思?

[复制链接]

2

主题

17

帖子

142

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
142
跳转到指定楼层
楼主
发表于 2023-3-6 20:47:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,请问无序哈希集对象 和普通的 哈希集对象 有什么区别呢?

回复

使用道具 举报

87

主题

953

帖子

4907

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4907
沙发
发表于 2023-3-6 21:24:15 | 只看该作者
有序:顺序插入:1,2,3,4,5,6,7,8,9 更快
无序:随机插入:5,66,51,99,8,3   更快

其它的我没测试,大概可能是这样吧..具体以自己测试为准
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40595
板凳
发表于 2023-3-6 22:11:06 | 只看该作者
就是没有顺序吧
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

6

主题

64

帖子

2599

积分

金牌会员

Rank: 6Rank: 6

积分
2599
地板
发表于 2023-3-6 22:54:06 | 只看该作者
本帖最后由 龙纹 于 2023-3-7 12:41 编辑

官方库的普通哈希表我认为是命名不当,其封装的是C++标准库中的map,跟哈希没什么关系,底层实现是红黑树,key和value是一对一的关系,插入一个值时内部会根据key进行排序,所以是有序的,插入、删除、搜索的时间复杂度是O(log(n))。
无序哈希表则是把一个key通过hash(哈希)操作变为另一个值,通过这个值能直接找到对应的value,所以在一般情况下,插入、删除、搜索是O(1),比map快,但在某些情况下达不到这个效率。
简单的讲,在数据量不大的时候,两者皆可,需要有序的情况下使用map,数据量非常大就根据实际场景决定。
(看错字了,这里解释的是哈希表...哈希集看下面 @Xelloss0618 的解释吧)

火山PC交流群: 748413192
回复

使用道具 举报

26

主题

1904

帖子

6941

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6941
5#
发表于 2023-3-7 11:35:49 来自手机 | 只看该作者
上面龙纹把火山里的哈希表当成哈希集了,火山里的哈希集是 std::set,无序哈希集是 std::unordered_set。
诚如龙纹所说,只有 std::unordered_set 是跟哈希有关的,std::set 实际是红黑树。

先说哈希集(std::set),相比数组,它有去重和排序功能。
首先是它的元素值是唯一的,不会重复插入同样的值。
其次,它插入值的时候,会通过比较函数进行排序,比如你按顺序插入 2、3、1,它内部会自动排序成 1、2、3。
相比数组,它不能用索引来访问元素值,只能通过迭代器访问元素值。

在C++里,std::set 的比较函数是可以自定义的,但火山的模板类无法实现自定义函数,只能按照从小到大排序,也无法针对性处理一些自定义类型。

无序哈希集(std::unordered_set),在插入值的时候会计算值的哈希值,通过该哈希值能快速找到要访问的值。
对于整数等基本类型,库的默认哈希函数自然能处理,例外的是文本型和字节集类,所以在「对象无序哈希集模板类」中使用了自定义的哈希函数,因为这个哈希函数的限制,你要封装其他类型,就要自己实现对应的哈希函数。

最后来个总结,有序和无序哈希集都有去重的作用,其中哈希集能同时实现排序功能。

插入速度上,理论上是无序比有序慢,因为哈希函数的耗时通常大于比较函数。
访问速度上(火山里的「是否存在」和「删除」方法),理论上是无序比有序快,因为只需要对检查的值进行哈希,然后通过哈希值就能到达要访问的值,而有序往往会从头到尾比较寻找要访问的值。

当然,在某些情况下,两者各自拥有的速度优势也不是绝对的。
回复

使用道具 举报

6

主题

64

帖子

2599

积分

金牌会员

Rank: 6Rank: 6

积分
2599
6#
发表于 2023-3-7 12:37:19 | 只看该作者
Xelloss0618 发表于 2023-3-7 11:35
上面龙纹把火山里的哈希表当成哈希集了,火山里的哈希集是 std::set,无序哈希集是 std::unordered_set。
...

我看错字了...看成哈希表了,所以解释的也是哈希表,哈希集其实是手误,我改正一下。
火山PC交流群: 748413192
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-28 04:11 , Processed in 0.094111 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表