【问题标题】: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)> 的包装器

标签: swift dictionary nsdictionary hashable equatable


【解决方案1】:

可散列键使字典插入和查找更加高效,尤其是对于大型字典。

如果键不可散列,为了找到特定键,您必须(在最坏的情况下)读取并比较字典中的所有键是否相等。

可哈希键自然会根据其哈希值划分为桶,要找到特定的键,您需要计算其哈希以确定它所在的桶,然后您只需比较属于同一桶的相等键即可。如果正确选择了哈希函数并且字典中的元素数量小于最大 Int 值,那么您很有可能每个桶只有一个键,从而使查找效率与 O(1) .

this related question有更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多