Swift 3.0 中使用索引访问字符串的 Big O

2024-05-12

访问的复杂度是多少Stringindex in swift 3.0?

复杂度与数组访问或 O(N) 或其他相同吗?

来自文档 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html在“字符串索引”下:

let greeting = "Guten Tag!"
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
.
.
.
for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n   T a g ! "

如果索引访问是 O(N),最后一个示例(迭代字符)将非常糟糕,因为仅以这种方式迭代字符将是 O(n^2)

我不确定的原因是以下陈述:“不同的字符[...]可能需要不同的内存量来存储”。

如果复杂度不是 O(n),那么它是如何工作的,因为不能仅将偏移量乘以常量来获取内存中的字符?


除非另有说明,否则实施Collection's subscript https://developer.apple.com/reference/swift/collection/1641358-subscript要求should时间复杂度始终为 O(1)。这是合同的一部分Collection itself.

As 文档 https://developer.apple.com/reference/swift/collection状态(强调我的):

符合的类型Collection预计将提供start​Index and end​Index特性以及以 O(1) 操作对元素进行下标访问。无法保证预期性能的类型必须记录离开 [...]

当你来到时,潜在的昂贵部分就会发生advance索引,例如index(_:offsetBy:) https://developer.apple.com/reference/swift/collection/1781645-index。其复杂度为 O(1)RandomAccessCollection,否则为 O(n),其中 n 是偏移量的大小。

String.CharacterView https://developer.apple.com/reference/swift/string.characterview不是一个RandomAccessCollection,因此推进索引是 O(n)。正如您所说,其原因是字符可以具有不同的字节长度。但是一旦你有了索引(其中内部 https://github.com/apple/swift/blob/master/stdlib/public/core/StringCharacterView.swift#L169只是字符串的 unicode 标量的偏移值以及 UTF-16 代码单元中给定扩展字素簇的长度),您可以在恒定时间内下标。

所以

for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")
}

是 O(n)。循环的每次迭代只是将当前索引前进 1,下标使用索引的偏移量跳转到扩展字素簇的开头,从而获取该给定索引的字符。

然而如果我们说:

for offset in 0..<greeting.characters.count {
    let index = greeting.index(greeting.startIndex, offsetBy: offset)
    print("\(greeting[index]) ", terminator: "")
}

That would be O(n2), because we're now advancing the index from the start index at each iteration of the loop (not to mention doing an O(n) walk just to get the count of the characters to begin with).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3.0 中使用索引访问字符串的 Big O 的相关文章

随机推荐

  • 反应本机矢量图标不显示

    我使用的是 React Native 版本 0 67 3 我安装矢量图标并添加 android app build gradle 适用于 node modules react native vector icons fonts gradle
  • FileDialog 保留以前的过滤器

    我正在 Access 数据库中制作表单 我需要打开文件对话框窗口几次 我只是不明白为什么在我更改选项值几次并打开文件对话框窗口后它没有更改过滤器 Public Sub Command17 Click Dim fd As FileDialog
  • npm run cmd 失败,而命令行上的 cmd 有效

    In my HTTP状态检查项目 https github com guyellis http status check 如果我跑node modules bin jshint I get node modules bin jshint t
  • Laravel 6:尚未设置外观根

    经过一段时间的努力 我已将我的网站从 Laravel 5 8 迁移到 Laravel 6作曲家更新我在网站上遇到此错误 并且仅使用命令PHP工匠 PHP Fatal error Uncaught RuntimeException A fac
  • 无法在 Android 模拟器上使用 ART

    我只是想在我的模拟器上尝试 android 4 4 的 ART 我所做的是创建一个模拟器 选择设备为 Nexus 7 目标为 Android 4 4 RAM 512 然后我启动模拟器并加载它 然后我进入开发者选项并选择运行时作为 ART 设
  • 以特定方式填充列表

    我需要填充一个包含 5 个位置的列表 new list 我收到 2 个列表 并且有一个默认值来填充新列表 现在开始解决问题 好的方式是 我从列表中接收 2 个值 从列表中接收 2 个值并添加默认值 A1 A2 DEFAULT B1 B2 但
  • 安装 OpenGL ES 并编译 Android 代码

    我刚刚开始在 android 上学习 OpenGL ES 使用这本书 https rads stackoverflow com amzn click com 1430226471 并遇到了采用的问题source http apress co
  • 更改选项卡时,文本框上的验证工具提示会变得孤立

    我在 TabControl 内的 TabItem 上有一个 TextBox 使用 INotifyDataError 基于更改的验证 当 TextBox 中存在错误并且您将注意力集中在 TextBox 上时 将显示验证工具提示 如果我导航到其
  • 我应该将 onClickListener 放在自定义 ListView 的哪里?

    我正在定制ListView包含 a 的行数CheckBox and a TextView 在我使用自定义之前ListViews使用 SimpleCursorAdapter 我的onListItemClick 工作得很好 我读过我必须添加一个
  • 在设置后用 Javascript 替换 'var' css 属性

    我有一个元素 其上设置了 var 属性 如下所示 div class divwithbackground div CSS divwithbackground after background image var page header se
  • 如何将 scala 列表转换为 javascript 数组?

    有更简单的方法吗 document ready function var jsArray if scalaList null for id lt scalaList jsArray push id 很简单 如下所示 import play
  • 反向 Django 外键查找的复杂性

    假设我有一个这样的模型 class Post models Model name models CharField max length 25 unique True class Picture models Model post mode
  • Application Insights 在 Azure 容器的 Web 应用程序中不起作用

    各位 您能告诉我如何在 Azure 上的 Linux docker 应用程序中启用应用程序洞察吗 我需要修改服务计划吗 None
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 用于分布式计算的 Tensorflow 设置

    任何人都可以提供有关如何设置张量流以在网络上的许多CPU上工作的指导吗 到目前为止 我发现的所有示例最多只使用一个本地盒子和多个 GPU 我发现我可以在 session opts 中传递目标列表 但我不确定如何在每个盒子上设置张量流来侦听网
  • Swift 3.0 中使用索引访问字符串的 Big O

    访问的复杂度是多少String与index in swift 3 0 复杂度与数组访问或 O N 或其他相同吗 来自文档 https developer apple com library prerelease content docume