математика из нескольких диапазонов - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с дальностью математики минус.

Во-первых, у меня большой диапазон значений int, пусть он будет:

Range_A = range (5, 21)

, затем я такжеиметь несколько небольших диапазонов, пусть это будет:

Range_B = (диапазон (1,4) + диапазон (1,7) + диапазон (10,16) + диапазон (19,26))

наконец, проблема в том, что Range_A остается после удаления всех элементов Range_B:

Range_A - Range_B =
range (7,10) + range (16, 19)

пока все просто, но, поскольку длина диапазонов может быть очень большой, когда я пытался с алгоритмом проверки каждого элемента в Range_A и Range_B (я использую структуру данных set () вPython, хотелось бы, чтобы это было быстрее), время работы все еще становится неприемлемым:

>>> A = set (range (5,21))

>>> B= set.union (набор (диапазон (1,4)), набор (диапазон (1,7)), набор (диапазон (10,16)), набор (диапазон (19,26)))

>>> A - B

установлено ([7,8,9,16,17,18])

def hug(a):
"""return start and end of continuous element from a list
[1,2,3,5,7,8,9,12] -> [[1,3],[7,9]]
return [-1,-1] if input is a empty list
"""
if not a:
    return [[-1,-1]]
a = sorted(list(set(a)))
res = []
head = a[0]; last = a[0]
for now in a[1:]:
    if now == last + 1:
        # proced
        last = now
        if now == a[-1]:
            res.append([head, last])
    else:
        #print now
        if head != last:
            res.append([head, last])
        head = now
        last = now
return res

# последний шаг

>>> обнять ([7,8,9,16,17,18])

[[7,9], [16,18]]

Я думал, что должны быть некоторые четкие способы достичь этого, просто проверяя начальную и конечную точку каждого диапазона, а не каждого элемента int в нем.

Спасибо!Любая идея будет оценена.

1 Ответ

0 голосов
/ 10 октября 2018

Сортировать все начальные и конечные точки диапазона вместе с полем aux=+1/-1 для начала или конца диапазона.

Пересечь отсортированный список, добавив aux к счетчику активных интервалов.

Когда счетчик становится ненулевым, объединение интервалов начинается

Когда счетчик становится нулевым, объединение интервалов заканчивается

Учет этих пустых интервалов внутри большой "секции"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...