Найти максимально пересекающееся подмножество диапазонов
Если у вас есть набор диапазонов, например, следующий простой пример...
[
[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, описанной в статье, с которой вы связаны. Вот мое понимание проблемы, и полиномиальное решение.
нам дано конечное множество диапазонов действительных чисел, скажем n: [A1, B1], [A2, B2],..., [An, Bn], где Ai
создайте отсортированный список начальной и конечной точек, упорядоченный численно, указывающий, является ли точка начальной или конечная точка.
в вашем примере, это будет: 12+, 14+, 15+, 17+, 20+, 21-, 22-, 25-, 27-, 62+, 64+, 65-, 70-, 80-
инициализировать curOverlap и maxOverlap до нуля.
повторите список, увеличивая 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 - если у вас есть повторяющиеся значения, подсчитайте плюсы перед минусами для каждого значения, чтобы включить диапазоны, которые перекрываются в одной точке.