Determing whether two ranges overlap
Magnus Lycka
lycka at carmen.se
Wed Feb 22 05:18:55 EST 2006
Fredrik Lundh wrote:
> def overlap(a, b):
> return a[1] > b[0] and a[0] < b[1]
Assuming that x[1] can't be smaller than x[0], this
is the right way to compare two ranges. Well, I guess
you need to figure out the borderline cases. Is it
a[1] > b[0] or a[1] >= b[0] which is relevant?
Anyway, if we have N ranges and N is big, we'll get
lots of comparisions: N*(N-1)/2.
For large values of N, it might be better to somehow
cache/aggregate the intervals if this makes it possible
to make this into an N*M comparision where M is smaller
than (N-1)/2....
E.g, with discrete values for the intervals such as with
(10, 15), one might consider something like (untested):
hits = sets.Set()
for interval in intervals:
for i in range(interval[0], interval[1]+1):
if i in hits:
raise ValueError('%s overlaps previous interval.'
% interval)
hits.add(i)
E.g. if we have 1000 intervals where the average size of
an interval is 10, you get 10000 "i in hits" and "hits.add(i)"
instead of 499500 'a[1] > b[0] and a[0] < b[1]'.
As always, it's good to measure...assuming you have fairly
realistic data to test with.
More information about the Python-list
mailing list