2015-04-17 5 views
1

У меня есть n элементов, каждый из которых имеет два атрибута int без знака x и y.Найти все группы, отвечающие одному критерию

Теперь я хотел бы узнать, все группы, которые соответствуют следующим условиям:

A.x >= B.y и B.x >= A.y.

Группы могут быть в числе 2, 3, ..., n. Например, A, B, C могут удовлетворить это требование друг с другом, поэтому это образует группу 3.

Элементы из двух или более групп могут перекрываться.

Как найти их эффективно?

Это реальная проблема, возникающая в моей работе, а не проблема с кодированием/алгоритмом.

+0

Пока не совсем ясно. Вы имеете в виду, что если два элемента A и B удовлетворяют этим двум условиям, то они принадлежат к одному кластеру, а в противном случае - нет? Если это так, проблема состоит в том, что эти условия не обязательно являются транзитивными: вполне возможно иметь 3 элемента A, B и C, такие, что A и B принадлежат одному кластеру, а также B и C, но A и C не , Например. A.x = 10, A.y = 12, B.x = 15, B.y = 5, C.x = 7, C.y = 11. –

+0

Извините за путаницу. На самом деле они могут перекрываться, поэтому я изменил термин «кластер» на «группу» в вопросе. Любые два элемента в одной группе отвечают этому требованию. – WindChaser

+0

Можете ли вы сказать, какой список групп будет для моего примера? –

ответ

1

Вы ищете cliques на графике. Узлы - это элементы, с ребрами, расположенными между двумя узлами, если они удовлетворяют вашему условию совместимости.

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

С другой стороны, в вашем случае, похоже, больше структуры, которая может помочь. Если я правильно понимаю, в клике в вашей ситуации все переменные x должны быть больше всех y-переменных (с один возможное исключение, см. Ниже), поэтому вы можете генерировать клики, просто выбирая некоторое число c и включая все элементы, которые удовлетворяют как x> = c, так и y < = c.

Я считаю, что вы можете искать максимальные и даже максимальные клики в этом случае, позволяя параметру c варьироваться от минимума x и y до максимума, а для каждого c подсчитывать количество элементов, удовлетворяющих условию x > = c, y < = c. Функция count будет ступенчатой ​​функцией, которая увеличивается или уменьшается на единицу, когда c = некоторые x или y.

Легко доказать, что этот метод генерирует клики. С немного больше работы мы можем увидеть, как быстро генерировать все клики. Во-первых, позвольте мне определить концепцию retrograde для элемента. Элемент A является ретроградным, если A.y> A.x. Предложение: клика может иметь не более одного ретроградного элемента. Доказательство. Если B также находится в клике, то B.x> = A.y> A.x> = B.y, поэтому B не является ретроградным. Кроме того, если клика содержит ретроградный элемент, то каждый другой элемент клики удовлетворяет условию B.x> = c и c> = B.y, для некоторого c (а именно c = A.x, или c = A.y, или некоторого c между ними).

С другой стороны, если клика не содержит ретроградного элемента, то каждый элемент клики удовлетворяет условию A.x> = A.y и A.x> = B.y, поэтому все y ограничены сверху на min x; аналогично все x ограничены снизу max y. Поэтому в этом случае вы можете выбрать c = min x или max y.

Другими словами, каждая клика является подмножеством одной из следующих клик: клика заключалась в том, что каждый элемент A удовлетворяет A.x> = c и c> = A.y для некоторого фиксированного c; или кликой с одним ретроградным элементом R, в котором все остальные элементы удовлетворяют условию A.x> = R.y и R.x> = A.y.Это должно дать все максимальные клики в чем-то между O (n) и O (n^2) временем; вы можете выбрать максимальную клику из набора максимальных клик.

+0

Для одного обхода с 'c', если есть элементы' k', удовлетворяющие условию, что 'x> = c и y <= c', это группа' k', правильно? – WindChaser

+0

Я думаю, что 'c' может находиться в диапазоне, которое выполняется этим требованием. Поэтому, если шаг числа велико, могут быть созданы повторяющиеся клики. – WindChaser

+0

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

0

Сортируйте данные по x и y +, затем установите пересечения.

Это затрудняет задачу. Не пытайтесь набросить на нее теоретическую модель фантазий (клика, кластеризация и т. Д.), Но нарисуйте визуально то, что вы ищете.

+0

Что вы подразумеваете под '' set intersections ''? – WindChaser

+0

http://en.wikipedia.org/wiki/Intersection_%28set_theory%29 Прошли ли вы визуальные зарисовки того, что вы хотите найти? это вам очень поможет. –