Ruby中如何找出数组新增元素及Array#-方法性能咨询
Ruby实现数组差集&性能分析
当然可以!你提到的Array#-方法正是实现这个需求的理想选择,咱们直接看代码示例:
arr1 = [1,2,3,4] arr2 = [1,2, 82, 167,3,79,4] def new_elems(arr1, arr2) arr2 - arr1 end new_elems(arr1, arr2) # 返回 [82, 167, 79]
关于Array#-的核心逻辑
这个方法会返回调用数组中存在,但参数数组中不存在的所有元素,并且会自动剔除重复的匹配项(比如如果arr2里有多个1,arr2 - arr1会把所有1都移除),完全契合你的需求。
上千元素的性能表现
完全不用担心性能问题!Ruby内部对Array#-做了针对性优化:当处理较大数组时,它会先把参数数组(也就是这里的arr1)转化为哈希集合,将元素查找的时间复杂度从O(n)降到O(1)。整体时间复杂度是O(m + n)(m、n分别是两个数组的长度),对于上千级别的元素来说,这个运算速度非常快,几乎不会出现性能瓶颈。
额外小提示
如果你的数组包含重复元素,需要保留原数组中重复的非匹配项,可以结合Array#reject和Set来实现,比如:
require 'set' def new_elems_with_duplicates(arr1, arr2) set = arr1.to_set arr2.reject { |elem| set.include?(elem) } end
这个方法会保留arr2中所有不在arr1里的元素,包括重复项。
内容的提问来源于stack exchange,提问作者user3442206
相关产品推荐
相关产品推荐

