当前位置: 首页 > 面试题库 >

Swift字典是否为性能编入索引?即使是外来类型(UUID)?

叶健柏
2023-03-14
问题内容

我想构造一些数组,以便快速搜索。如果我使用这样的东西:

let dictionary: [Int:Int] = [:]
for i in 0 ..< 10000000 {
    dictionary[i] = 0
}

查询:

dictionary[n] == nil

在对数时间内执行

如果是,其他类型是否相同:浮点,双精度,字符串。

最后,我需要它与UUID类型配合使用,是否可以使用?


问题答案:

Swift的Dictionary实现是通过哈希表实现的,因此,假设哈希算法良好,查找通常会在O(1)时间内完成。正如@rmaddy所说,这意味着密钥的 类型 主要是无关紧要的-真正重要的是密钥是否具有的良好实现hashValue,对于标准库类型,您完全不必担心。

哈希表查找的最坏情况时间复杂度(假定 最大
哈希冲突)取决于哈希表如何解决冲突。在的情况下Dictionary,可以使用两种存储方案,本机存储或可可存储。

来自HashedCollections.swift.gyb:

在正常使用中,您可以期望Dictionary的后备存储为NativeStorage。

[…]

本机存储是具有开放式寻址和线性探测功能的哈希表。桶阵列形成一个逻辑环(例如,一条链可以绕着桶阵列的末端缠绕到其开头)。

因此,最坏情况下的查找时间复杂度为O(n),就好像每个元素都具有相同的哈希值一样,潜在地,必须搜索每个元素才能确定表中是否存在给定的元素。

对于可可存储,使用_CocoaDictionaryBuffer包装器来包装NSDictionary。不幸的是,尽管它是Core
Foundation的对应CFDictionary头文件指出:

对于当前和将来的任何实现,字典中的值的访问时间均保证为最差O(lg N)

(听起来好像它使用平衡的二叉树来处理冲突。)



 类似资料:
  • 问题内容: 我有一个带有主键id和外键f的表T。将f指定为外键时是否自动为其编制索引?我是否需要显式添加f的索引? 问题答案: 没有创建索引,所以是的,您需要添加显式添加索引。 编辑添加… 我可能应该补充一点,表T中数据的源表/列必须具有唯一索引。如果尝试对不是唯一索引的列(无论是作为PK还是具有UNIQUE约束)创建FK,则无法创建FK。

  • 问题内容: 我正在使用Xcode 6.4 我有一个UIViews数组,我想用keys转换成Dictionary 。像这样: 这行得通,但是我正在尝试以更实用的样式进行操作。我想我不得不创建变量使我感到困扰。我很乐意使用并喜欢这样: 感觉更好,但是我遇到了错误:我尝试了其他对象(例如)进行此操作,但遇到了同样的错误。 有什么清理建议吗? 问题答案: 尝试这样: Xcode 8•Swift 2.3 X

  • 问题内容: 我将要编写一个包含的查询。顾名思义,是一个布尔字段(实际上是a ,根据需要设置为0或1)。 索引该字段是否有任何性能提升?引擎(在这种情况下为InnoDB)在查找索引时会表现得更好还是更差? 问题答案: 并不是的。您应该像书一样思考它。如果一本书中只有3种单词并且您都对它们进行了索引,那么您将拥有与普通页面相同数量的索引页面。 如果一个值的记录相对较少,则性能会有所提高。例如,如果您有

  • 区分度不高的字段不适合做索引,因为索引页是需要有开销的,需要存储的,不过这类字段可以做联合索引的一部分。

  • 问题内容: MySQL是否自动索引外键列? 问题答案: 是的,但仅在innodb上。Innodb是当前唯一实现了外键的表格式。

  • 问题内容: 在Swift中,是否有任何方法可以检查数组中是否存在索引而不会引发致命错误? 我希望我可以做这样的事情: 但是我明白了 致命错误:数组索引超出范围 问题答案: Swift中的一种优雅方式: