swift - Swift String 的 count 属性时间复杂度
问题描述
我想知道 Swift (Swift 5) String 的 count 属性的时间复杂度是多少?我发现它很慢。
我猜它是 O(n),线性时间复杂度,但找不到任何关于它的文档。任何人都可以帮忙吗?
与 Array 的 count 属性相比,我对其进行了一些测试,后者的速度更快。
在我的机器上测试结果:
测试用例“-[TESTS.TESTS testArrayCountPerformance]”通过(1.686 秒)。
测试用例“-[TESTS.TESTS testStringCountPerformance]”通过(11.113 秒)。
class TESTS: XCTestCase {
let letters = Array("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
var randomString = ""
var randomChars: [Character] = []
override func setUp() {
for _ in 0..<1000000 {
randomString += String(letters[Int.random(in: 0..<letters.count)])
}
randomChars = Array(randomString)
}
func testStringCountPerformance() {
measure {
for _ in 0..<100 {
_ = randomString.count
}
}
}
func testArrayCountPerformance() {
measure {
for _ in 0..<100 {
_ = randomChars.count
}
}
}
}
解决方案
Array
符合RandomAccessCollection
. String
符合BidirectionalCollection
. 如果您查看协议的文档,Collection
您会发现:
某些集合操作的性能取决于集合提供的索引类型。例如,可以在 O(1) 时间内测量两个索引之间的距离的随机访问集合,可以在 O(1) 时间内计算其计数属性。相反,因为前向或双向集合必须遍历整个集合来计算包含元素的数量,所以访问它的 count 属性是一个 O(n) 操作。
因此,您可以预期String.count
比Array.count
.
推荐阅读
- agda - 编码集合(唯一元素列表)的正确方法是什么?
- java - 在 React Native 的桥接 Java 方法中使用 Logback
- ruby-on-rails - DotEnv 不会在 database.yml 中加载值
- office-js - 如果在几分钟后等待,则无法在 ItemSend 事件中关闭 Dialog API 对话框
- nuxt.js - 如何开始将 AWS Amplify 集成到 Nuxt.js 项目?
- javascript - 包括还是包括?
- c# - 如何配置 .NET Core Azure 日志记录
- python - 子线程中的 I/O 函数调用超时
- python - 熊猫如何在特定范围内逐行增加滚动平均值的值
- java - 如何在 Java / Android Studio 中将服务器的证书添加到客户端