Вы ищете 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) временем; вы можете выбрать максимальную клику из набора максимальных клик.
Пока не совсем ясно. Вы имеете в виду, что если два элемента 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. –
Извините за путаницу. На самом деле они могут перекрываться, поэтому я изменил термин «кластер» на «группу» в вопросе. Любые два элемента в одной группе отвечают этому требованию. – WindChaser
Можете ли вы сказать, какой список групп будет для моего примера? –