提高过滤可能包含数十万个元素的数组的效率
Posted
技术标签:
【中文标题】提高过滤可能包含数十万个元素的数组的效率【英文标题】:Improving on the efficiency of my filtering of arrays with potentially hundreds of thousands of elements 【发布时间】:2021-12-25 22:42:46 【问题描述】:我有一个数字数组。我想在array1
中找到不在array2
中的那些,像这样:
var array1 = [1, 2, 3, 4]
var array2 = [2, 4, 5, 6]
var result = [1, 3]
我通过循环遍历array2
中的所有数字并将它们添加到字典中解决了这个问题。然后我循环遍历array1
并将那些不在字典中的添加到结果数组中:
var result: [Int] = []
var numbersDict: [Int : Bool] = [:]
for element in array2
numbersDict[element] = true
for element in array1
if numbersDict[element] == nil
result.append(element)
我还想在array2
中找到那些不在array1
中的人
var array1 = [1, 2, 3, 4]
var array2 = [2, 4, 5, 6]
var result = [5, 6]
我已经这样解决了:
var result: [Int] = []
var numbersDict: [Int : Bool] = [:]
for element in array1
numbersDict[element] = true
for element in array2
if numbersDict[element] == nil
result.append(element)
我怎样才能以最有效的方式做到这一点?假设这些数组可能有数十万甚至数十万个数字长。我应该使用排序吗?
【问题讨论】:
如果数组中的元素是唯一的,我会从字典中删除元素,因为我在 array2 中找到它们。最后,字典保存了 array1 中不在 array2 中的元素。如果无法进行这样的优化,只需在构建结果时创建 array2 中元素的字典。然后为 array1 运行一个循环并检查它,就像你已经为 array2 做的那样。 @user1984 他们是独一无二的,是的。在“现实生活”中,这些数字实际上是具有 ID 的唯一用户。我只是在这里将其简化为数字。你能举个例子吗,我不确定我是否完全理解? 当然,你不介意我用伪代码或 python 给出它吗?我不是一个敏捷的人。 【参考方案1】:只需使用Set
。
获取array1
中的元素但不在array2
中的示例:
let array1: Set = [1, 2, 3, 4]
let array2: Set = [2, 4, 5, 6]
let result = array1.subtracting(array2)
print(result)
// Prints: [1, 3] <- Order may vary since it is a set
只需将两组互换即可得到相反的结果,在array2
中而不是在array1
中。
有很多Set
操作,还有一个是intersection(_:)
:
let result = array1.intersection(array2)
print(result)
// Prints: [2, 4] <- Again, no order
【讨论】:
以上是关于提高过滤可能包含数十万个元素的数组的效率的主要内容,如果未能解决你的问题,请参考以下文章