【发布时间】:2025-12-20 21:25:11
【问题描述】:
swift使用String.count的时候是:
O(n) 每次调用它时,我们都会遍历整个 String 以对其进行计数
或
O(1),其中 swift 之前存储了这个数组的大小并简单地访问它。
【问题讨论】:
-
肯定是
O(n)。来自Swift Book:“请注意,count 属性必须遍历整个字符串中的 Unicode 标量,以确定该字符串的字符”。唯一的问题是,一旦确定了count并且字符串没有被修改,是否有缓存机制 -
@CodeDifferent 有趣。该段似乎暗示
Array.count将是O(1)如果每个元素占用相同数量的空间。 -
@Deco 该段专门针对
String.count而不是Array.count。尽管String在 Swift 4 中实际上是Array<Character>,但您永远不应忘记,由于 Unicode 字形簇和普通字符的性质,它的行为并不总是像普通的Array。这对于索引和计数String中的字符尤其重要。请参阅同一文档中的这句话:“因此,如果不遍历字符串以确定其扩展的字素簇边界,就无法计算字符串中的字符数。” -
从技术上讲,
O(n)是一个渐近的上限,所以即使String确实缓存了count,描述时间在技术上仍然是正确的复杂性为O(n);) 此外,the documentation forCollection表示如果集合符合RandomAccessCollection,count的性能为“O(1);否则为O(n),其中@987654343 @ 是集合的长度”——所以鉴于String不是RandomAccessCollection,它是O(n)。 -
@Honey A
RandomAccessCollection是一个集合,其索引可以在O(1)时间偏移n位置。因为count是衡量您可以将startIndex偏移多少次以最终到达endIndex的量度,所以随机访问集合总是可以在恒定时间内获得它们的计数。但是,作为随机访问集合并不一定意味着具有整数索引。例如,ReversedCollection<[Int]>是RandomAccessCollection(感谢条件一致性),但它具有跟踪基本集合索引的不透明索引类型。