【发布时间】:2015-10-13 04:58:01
【问题描述】:
在 Swift 2 中,给定一个字符串 s,这些语句的运行时复杂度是多少:
s.characters.count
s.endIndex
s.utf8.count
s.utf16.count
s.unicodeScalars.count
另外,如果我知道一个字符串只包含字母,那么获取第 n 个字符的最有效方法是什么?
【问题讨论】:
标签: swift swift2 string-length
在 Swift 2 中,给定一个字符串 s,这些语句的运行时复杂度是多少:
s.characters.count
s.endIndex
s.utf8.count
s.utf16.count
s.unicodeScalars.count
另外,如果我知道一个字符串只包含字母,那么获取第 n 个字符的最有效方法是什么?
【问题讨论】:
标签: swift swift2 string-length
好的,我正在尝试回答我自己的问题。如果我错了,请随时纠正我。
s.characters.count // O(N)
s.endIndex // O(1)
s.utf8.count // O(N)
s.utf16.count // O(N)
s.unicodeScalars.count // O(N)
Apple 的documentation on CollectionType.count 表示“复杂性:如果Index 符合RandomAccessIndexType,则为O(1);否则为O(N)。”由于CharacterView、UnicodeScalarView、UTF16View 或UTF8View 中没有一个Index 符合RandomAccessIndexType,因此访问它们的计数都是O(N)。
【讨论】:
s.characters、s.utf16 等。您列出的那些复杂性值是您拥有集合类型后的值,不一定包括将字符串转换为该类型。
如果您无权访问这些表达式的源代码(除非您为 Apple 工作,否则您无权访问),并且文档没有提及复杂性(它没有,我已经检查过) ,实际上可能值得对大小为 1、10、100、1000 等字符串的操作进行基准测试。
生成的数据虽然不是确定的,但至少可以指示每个数据的时间复杂度。
就在字符串的给定索引处获取正确字符而言,这已涵盖here。无论 Apple 选择什么方法来索引字符串,都将尽可能快(他们不喜欢慢代码而不是快代码,所有其他条件都相同)。
【讨论】:
String,如果您想将其添加到您的答案中。