Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]
Posted
技术标签:
【中文标题】Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]【英文标题】:Swift : Why is it required for the key type in a Dictionary to be of type Hashable [duplicate]Swift:为什么字典中的键类型必须是 Hashable 类型 [重复] 【发布时间】:2018-05-01 14:24:21 【问题描述】:如果我想创建一个Dictionary<Key:Value>()
,则需要Key
类型对象到协议Hashable
。为什么会这样,字典是如何实现的?
我的意思是我会理解,如果Key
只需要符合Equatable
类型的协议,因为程序将不得不搜索相关值,但是,额外的var hashValue: Int
随之而来Hashable
有点混乱
【问题讨论】:
提示:字典是一个哈希映射。 这不是一个 Swift 问题,而是一个一般的编程问题。根据定义,字典是一种数据结构,它使用键的哈希值来定位它们的值。 @rmaddy 更有意义 :-) 为什么他们称它为字典?应该称它为类似于 Java 的 HashMap @BallpointBen 字典(通用计算数据结构,也称为关联数组)不需要使用哈希来查找值,它比那个更通用。字典是键值对的集合,您只需拥有适当的键即可使用它们来存储和查找值。哈希部分是一种优化,通过将字典实现为哈希映射来提供更快的查找时间。它可以很容易地成为一个搜索树型结构。 而“搜索树型结构”将要求元素为Comparable
而不是 Hashable
。每个都有其权衡。 OP:如果您正在寻找使用 Equatable
键的关联数据类型,请参阅 DictionaryLiteral
,它基本上只是 Array<(Key: Equatable, Value)>
的包装器
【参考方案1】:
可散列键使字典插入和查找更加高效,尤其是对于大型字典。
如果键不可散列,为了找到特定键,您必须(在最坏的情况下)读取并比较字典中的所有键是否相等。
可哈希键自然会根据其哈希值划分为桶,要找到特定的键,您需要计算其哈希以确定它所在的桶,然后您只需比较属于同一桶的相等键即可。如果正确选择了哈希函数并且字典中的元素数量小于最大 Int
值,那么您很有可能每个桶只有一个键,从而使查找效率与 O(1) .
this related question有更多信息。
【讨论】:
以上是关于Swift:为啥字典中的键类型必须是 Hashable 类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章