【问题标题】:Runtime complexity of getting the length of a string in different representations获取不同表示形式的字符串长度的运行时复杂度
【发布时间】: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


    【解决方案1】:

    好的,我正在尝试回答我自己的问题。如果我错了,请随时纠正我。

    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)。”由于CharacterViewUnicodeScalarViewUTF16ViewUTF8View 中没有一个Index 符合RandomAccessIndexType,因此访问它们的计数都是O(N)。

    【讨论】:

    • Ethan,如果您希望此答案完整,则需要包含操作s.characterss.utf16 等。您列出的那些复杂性值是您拥有集合类型后的值,不一定包括将字符串转换为该类型。
    • 你是对的,但我们可以假设这些操作不会比 O(N) 差。
    • 如果你要假设,你也可以假设你的问题的答案。您是否想要一个明确的答案:-)
    • 如果不是这样,我会感到惊讶。它们可能是 O(1)。
    【解决方案2】:

    如果您无权访问这些表达式的源代码(除非您为 Apple 工作,否则您无权访问),并且文档没有提及复杂性(它没有,我已经检查过) ,实际上可能值得对大小为 1、10、100、1000 等字符串的操作进行基准测试。

    生成的数据虽然不是确定的,但至少可以指示每个数据的时间复杂度。

    就在字符串的给定索引处获取正确字符而言,这已涵盖here。无论 Apple 选择什么方法来索引字符串,都将尽可能快(他们不喜欢慢代码而不是快代码,所有其他条件都相同)。

    【讨论】:

    • 我删除了我的答案,因为我觉得你的更好。这是link to the documentation for String,如果您想将其添加到您的答案中。
    • 感谢您的回答,但我认为您没有回答我的问题。我们无权访问源代码,但我们可以访问文档。而且我不是在问如何通过索引获取字符,而是最有效的方法。
    • @Ethan,我正在回答第一个问题。在文档中没有源代码和明确声明的情况下,您唯一能找到的方法就是测试。你在文档中既没有来源也没有声明,所以这就是你必须做的。而且我保证 Apple 会尽可能快地进行字符串索引,因此您应该使用他们提供的内容。我会尽量让我的意图更清楚。
    • Apple 目前不提供源代码,但提供文档。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多