我有一个整数数组(或可能是一组)(可能是非连续的,但都是唯一的)和一系列(连续的)数字。如果我想检查数组中是否存在范围内的任何数字,那么最有效的方法是什么?
array = [1, 2, 5, 6, 7]
range = 3..5
我可以遍历范围并检查数组是否include?
每个元素,但这似乎很浪费,而且数组和范围都很容易变得非常大。
有什么方法我可以用来做某种array.include_any?(range)
,还是我应该寻找有效的搜索算法?
我有一个整数数组(或可能是一组)(可能是非连续的,但都是唯一的)和一系列(连续的)数字。如果我想检查数组中是否存在范围内的任何数字,那么最有效的方法是什么?
array = [1, 2, 5, 6, 7]
range = 3..5
我可以遍历范围并检查数组是否include?
每个元素,但这似乎很浪费,而且数组和范围都很容易变得非常大。
有什么方法我可以用来做某种array.include_any?(range)
,还是我应该寻找有效的搜索算法?
我会做
(array & range.to_a).present?
或者
array.any? { |element| range.cover?(element) }
我会根据范围的大小选择一个版本。如果范围很小,那么第一个版本可能会更快,因为它会创建一次交集并且不需要检查cover
数组中的每个元素。而如果范围很大(但数组很小),第二个版本可能会更快,因为一些比较可能比从一个巨大的范围生成一个数组并构建交集更快。
([1, 2, 5, 6, 7] & (3..5).to_a).any?
# => true
不需要臭味&
:
array.uniq.size + range.size > (array + range.to_a).uniq.size