Найти максимально пересекающееся подмножество диапазонов

Если у вас есть набор диапазонов, например, следующий простой пример...

[
    [12, 25], #1
    [14, 27], #2
    [15, 22], #3
    [17, 21], #4
    [20, 65], #5
    [62, 70], #6
    [64, 80]  #7
]

... как вы вычисляете максимально пересекающиеся подмножества (не совсем уверен, как это сформулировать, но я имею в виду "подмножество диапазонов, которое пересекается и имеет самую высокую мощность") и определить степень пересечения (мощность диапазонов в этом подмножестве)?

логически я могу это решить и, возможно, смогу перевести это на наивный алгоритм. Спускаясь по список, мы видим, что 1-5 пересекаются, и 5-7 пересекаются, и что #5 пересекает оба набора.

результат, который я хочу, - это просто подмножество, так как это дает мне информацию о мощности, и я могу легко вычислить пересечение множества, пока они все пересекаются. В приведенном выше примере, это будет [[14, 27],[15, 22],[12, 25],[17, 21],[20, 65]].

С верхней части моей головы я мог бы попытаться преобразовать каждый диапазон в узел графика, соединяя пересекающиеся и находя самый большой полностью связанный граф.

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

я мог бы попробовать что-то реализовать (lang-ruby FWIW), но я хотел бы услышать, как другие может решить эту проблему, и какой самый эффективный и элегантный способ может быть.

обновление:

Я считаю, что это конкретный случай максимальной проблемы клики, которая NP-трудна и, следовательно, на самом деле трудна. Предложения для аппроксимаций / реального использования будут наиболее оценены!

см. также:http://en.wikipedia.org/wiki/Maximum_clique/найти все полные подграфы в a график

обновление 2

нашел хорошее доказательство NP-твердости и NP-полноты этой проблемы здесь:http://www.cs.bris.ac.uk / ~popa / ipl.pdf

похоже, что это конец строки. Извините, ребята! Я буду работать с достаточно жадным приближением. Спасибо.

Как сказано в ответах, я не думаю, что статья описывает эту проблему... у нас, вероятно, есть больше информации, основанной на диапазон.

1 ответов


Если я правильно понимаю проблему, это не экземпляр проблемы NP, описанной в статье, с которой вы связаны. Вот мое понимание проблемы, и полиномиальное решение.

  1. нам дано конечное множество диапазонов действительных чисел, скажем n: [A1, B1], [A2, B2],..., [An, Bn], где Ai

  2. создайте отсортированный список начальной и конечной точек, упорядоченный численно, указывающий, является ли точка начальной или конечная точка.

в вашем примере, это будет: 12+, 14+, 15+, 17+, 20+, 21-, 22-, 25-, 27-, 62+, 64+, 65-, 70-, 80-

  1. инициализировать curOverlap и maxOverlap до нуля.

  2. повторите список, увеличивая curOverlap для каждого + и уменьшая его для каждого -. Установите maxOverlap = max (curOverlap, maxOverlap) на каждом приращении.

чтобы продолжить свой пример:
вал, вал, Макс
12, 1, 1
14, 2, 2
15, 3, 3
17, 4, 4
20, 5, 5
21, 4, 5
22, 3, 5
25, 2, 5
27, 1, 5
62, 2, 5
64, 3, 5
65, 2, 5
70, 1, 5
80, 0, 5

максимальное перекрытие 5. Вы также можете сохранить val, связанный с max, Если вы хотите знать, где произошло максимальное перекрытие. Это даст тебе 20. в этот пример. Затем тривиально пройти через начальный набор диапазонов и найти 5, которые включают 20.

-edit - если у вас есть повторяющиеся значения, подсчитайте плюсы перед минусами для каждого значения, чтобы включить диапазоны, которые перекрываются в одной точке.