首页 > 解决方案 > Ruby:比较两个数组数组的有效方法

问题描述

我搜索最有效的方法来获得两个数组数组之间的差异。在这一点上,我不知道使用哈希是否会更好。

我有两个数组数组,其中一个 id 和一个转换为 int 的日期时间。

a = [[1, 1234],[2, 7345],[3, 12769],[4, 13456], [5, 34765]]
b = [[1, 1234],[3, 12769],[2, 7345],[5, 39875],[4, 13459]]

我的目标是知道 a 的每个数组中包含的日期是否优于 b 中具有相同 id 的日期,并保留与比较匹配的数组,否则我会做类似 a - b 的事情。

即使有大量阵列,最快和最干净的方法是什么?

另一种方法是使用哈希,我真的不知道该使用什么。

a = [{id: 1, date: 1234},{id: 2, date: 7345},{id: 3, date: 12769},{id: 4, date: 13456},{id: 5, date: 34765}]
b = [{id: 1, date: 1234},{id: 3, date: 12769},{id: 2, date: 7345},{id: 5, date: 39875}, {id: 4, date: 13459}]

你觉得呢?你有没有什么想法 ?

标签: arraysrubysorting

解决方案


b具有哈希值更容易且性能更好。幸运的是,可以将 2 元素数组的数组直接转换为散列 with .to_h(并返回数组 with .to_a)。

# this will make an { <id> => <date> } hash
b_hash = b.to_h

现在过滤步骤只涉及一个selectover a,检查b_hash. 我用来|(id, date)|将数组解构为各个元素:

result = a.select do |(id, date)|
  b_hash[id] > date
end

请注意,您确实希望将.to_h调用保持在select循环之外,因为它是 O(N) 操作。

你可以在不转换的情况下做到这一点b.to_h,你只需要循环遍历b的每个元素a,将时间复杂度从 O(N) 变为 O(N^2)


推荐阅读