我有一个数组(或可能是一组)整数(可能是非顺序但都是唯一的)和一系列(顺序)数字。如果我想检查数组中是否存在该范围内的任何数字,那么最有效的方法是什么?
array = [1, 2, 5, 6, 7]
range = 3..5
我可以遍历范围并检查数组include?
是否每个元素,但这看起来很浪费,数组和范围都很容易变大。
我是否可以使用任何方法来执行某种array.include_any?(range)
,或者我应该寻找有效的搜索算法?
答案 0 :(得分:3)
我愿意
(array & range.to_a).present?
或
array.any? { |element| range.cover?(element) }
我会选择一个版本,具体取决于范围的大小。如果范围很小,第一个版本可能更快,因为它创建了一次交集,并且不需要为数组中的每个元素检查cover
。然而,如果范围很大(但阵列很小),那么第二个版本可能会更快,因为在大范围内生成阵列并建立交叉点时,进行一些比较可能会更快。
答案 1 :(得分:1)
([1, 2, 5, 6, 7] & (3..5).to_a).any?
# => true
答案 2 :(得分:0)
不需要stinkin'&
:
array.uniq.size + range.size > (array + range.to_a).uniq.size