遍历数组的时间复杂度为 O(n)。听起来可以接受,对吧?当我们在截止日期之前有大量工作要做时,我们可能会忽略它对代码性能的影响,并且不会花更多的精力去思考更好的解决方案。但是一旦使用这个技能成为一种自然反应,我们可能不知道我们甚至在代码中编写了嵌套的 for 循环或嵌套的过滤器,这将时间复杂度增加到 O(n²),并且我们很可能会受到性能的影响以后的问题。
尝试在非顺序集合类型中搜索,例如Setand Dictionary,而不是Array,因为在 Set和 dictionary中搜索的时间复杂度dictionary是 O(1),而在 Array 中搜索的时间复杂度是 O(n)。
在本文中,我将向您展示如何使用Set和优化速度dictionary。
例1中,有所有会员的数据和白金会员的id。members目标是从with中派生出一系列白金会员platinumMemberIDs。
let members: [Member]
let platinumMemberIDs:[Int]
时间复杂度filter(:)是O(n),数组实例方法的时间复杂度contains(:)也是O(n)。
以下方法遍历members数组。在每次迭代中,它都会搜索platinumMemberIDs以检查是否platinumMemberIDs包含当前成员的 id。
这种方法的时间复杂度是 O(n²)。
var PlatinumMembers = members.filter {
PlatinumMemberIDs.contains($0.id)
}