如何计算Ruby中两个普通区间的交集?

时间:2014-07-24 05:12:06

标签: ruby arrays intersection intervals

间隔由它们的边界给出为数组[a,b]和[x,y]。我想计算它们之间的交叉长度。根据此页面:http://world.std.com/~swmcd/steven/tech/interval.html

如果

,我可以告诉它是0
(not (a < y && x < b)) 

成立。

例如,区间[1.2,4.3]和[2.1,5.5]交叉点长度为4.3 - 2.1 = 2.2

3 个答案:

答案 0 :(得分:6)

这应该这样做。

<强>代码

def length(a,b,p)
  [[a.last,b.last].min - [a.first,b.first].max,0].max.round(p)
end

<强>实施例

enter image description here

答案 1 :(得分:0)

这是同一问题的OO解决方案。我建议构建一个自定义的Interval类,但这个实现只是一个例子,提问者应该根据他的实际情况考虑一下:

class Interval
  attr_reader :range

  def initialize range
    @range = if range.nil? then nil else
               fail TypeError, "Begin greater than end!" if range.begin > range.end
               Range.new( range.begin, range.end )
             end
  end

  def - other
    begin
      self.class.new [ range.begin, other.range.begin ].max ..
                     [ range.end, other.range.end ].min
    rescue TypeError
      self.class.new nil
    end
  end

  def size
    range.nil? ? 0 : range.end - range.begin
  end
end

def Interval a, b # a convenience constructor
  Interval.new a .. b
end

( Interval( 1.2, 4.3 ) - Interval( 2.1, 5.5 ) ).size
#=> 2.199999999999997

答案 2 :(得分:0)

仅供将来参考 - 在MySQL Cary的回答是(没有舍入部分):

GREATEST( LEAST(`a_last`, `b_last`) - GREATEST(`a_first`, `b_first`), 0 )