提高此过滤功能的效率



我有一个(可能非常大的(users数组。如果用户包含在这个数组中,我想从这个数组中删除一个特定的用户

if users.contains(user) {
users = users.filter { $0.id != user.id }
count -= 1
change -= 1
}

从时间和空间复杂性的角度考虑,contains()是O(n(运算,而filter()也是O(n(运算。

我可以这样做:

for (index, user) in users.enumerated() {
if user == userToRemove {
users.remove(at: index)
count -= 1
change -= 1
}
}

但这里remove(at:)是一个O(n(运算,for循环也是如此。因此,在这两种情况下,我都必须在整个数组中循环两次。

我可以做的另一件事是事先将其转换为Set,但这会丢失排序。

有没有办法提高它的效率,使它最多只需要循环一次?

假设您想要唯一的用户,您可以只使用Set,其contains是O(1(。

如果您需要订购用户,可以使用Swift Collections包中的OrderedSet

最新更新