提高过滤可能包含数十万个元素的数组的效率

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

【讨论】:

以上是关于提高过滤可能包含数十万个元素的数组的效率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redis 中批量删除数十万个带有特殊字符的键

核心数据,排序搜索——有可能吗?

38 基于RocketMQ的数据过滤机制,提高订单数据库同步的处理效率

高性能多层标签过滤

Python,查找范围是否包含范围列表中的另一个较小范围

过滤数组的元素(如果包含在其他元素中)