2014-01-15 3 views
3

Учитывая набор из n пар целых чисел, существует ли быстрый способ определить, существуют ли две пары (x_1, y_1) и (x_2, y_2) в множестве такие, что x_1! = X_2 и y_1! = y_2?Найти уникальную пару пар

Например, {(0,1), (0,2), (2,1), (3,2)} имеет {(0,2), (2,1)}. Однако {(1,0), (2,0), (3,0) не имеет ни одной удовлетворяющей пары пар.

Наивный подход просто пробует все пары пар. Их O (n^2). Можете ли вы получить что-то ближе к линейному времени?


Если это ускорит процесс, мы можем предположить, что пары хранятся в виде указателей из массива в отсортированном порядке (тогда первая затем вторая координата).

+0

Вам лучше добавить то, что вы сделали. – herohuyongtao

+0

@herohuyongtao Вы можете попробовать все возможные пары, но это O (n^2). Я хотел бы знать, можно ли приблизиться к линейному времени. – marshall

+0

Вы можете получить 'O (n)' с помощью [set] (http://en.wikipedia.org/wiki/Set_%28abstract_data_type), реализованного с помощью хэш-таблицы – goncalopp

ответ

2

Вы можете использовать следующий алгоритм O (n). Для упрощения обозначений позвольте мне (x, y) a .

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

+1

Вы имеете в виду строку параллельно оси x или y? В конце концов (1,1), (2,2), (3,3) образует прямую. – marshall

+0

Я люблю наши ответы: математики вырвали бы их волосы! – Ziggy

+0

Точно. Я просто обновлю ответ. –

1

Если первые две пары (x1, y1) и (x1, y2) [y1 != y2], затем из оставшегося списка пар, если вы обнаружите какие-либо x != x1, его соответствующий y должен либо не может быть равен y1 или не равна y2.

+0

Да, это звучит правильно. Так что это действительно линейное время. Однако мне было интересно, может ли быть даже постоянное время, если вы предполагаете, что пары уже помещены в массив в отсортированном порядке. Можете ли вы просто взглянуть на первую и последнюю пару? – marshall

+0

да это O (n). –

0

Вторая попытка:

Вам понадобится: 1 граф и 1 целое i.

Iterate над вашими парами, помещая их в направленном граф, как вы идете, такой, что для каждого (x, y) есть направленное ребро x -> y. После добавления ребра к графику проверьте обе вершины:

Если вершины x и y имеют нулевую степень, приращение i. В противном случае для каждой вершины, имеющей степень ровно 2, декремент i.

До тех пор, пока i > 0 существует пара пар, которые удовлетворяют вашему состоянию.

+0

Надеюсь, я прав! – Ziggy

+0

Я предполагаю, что «степень» здесь есть пара, (a, b), где a - число краев инцидентов, а b - число ребер, выходящих из вершины (что противоположно инциденту? Exident?) – Ziggy

0

Это немного зависит от языка, который вы используете, но на Java вы можете создать класс Pair и переопределить equals и hashcode. Сделайте equals return true, если x1 == x2 ИЛИ y1 == y2. Затем просто создайте HashSet<Pair> и добавьте все свои пары. То, что будет в конце в конце, будет все четкие пары, согласно вашему определению равенства.

+0

Какова временная сложность вставки при переопределении равных и хэш-кодов? – marshall

+0

Я думаю, что неустановленная проблема заключается в том, как вы на самом деле должны написать 'hashcode' для выполнения определения. – goncalopp

Смежные вопросы