找到一对独特的对

时间:2014-01-15 16:44:12

标签: algorithm

给定一组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)。你能得到更接近线性时间的东西吗?


如果速度加快,我们可以假设这些对按照排序顺序存储为数组的指针(然后是第一个然后是第二个坐标)。

4 个答案:

答案 0 :(得分:2)

您可以使用以下O(n)算法。为简化表示法,我可以将(x,y)称为

请注意,只有当所有点都位于与轴平行的一条线上时,才会存在这样的点对。先通过前两点确定该线,然后对每个新点检查它是否位于同一条线上。

答案 1 :(得分:1)

如果前两对是(x1, y1)(x1, y2) [y1 != y2],那么从剩余的对列表中,如果找到任何x != x1,则其对应{{ 1}}要么不等于y要么等于y1

答案 2 :(得分:0)

第二次尝试:

您需要:1个图表和1个整数i

对你的对进行迭代,然后将它们放入定向图表中,这样每(x, y)个有一个有向边x -> y。向图形添加边后,检查两个顶点:

如果xy顶点都具有零度,则递增i。 否则,对于度数正好为2的每个顶点,递减i

只要i > 0存在一对满足您条件的对。

答案 3 :(得分:0)

这取决于您使用的语言,但在Java中,您可以创建Pair类,并覆盖equalshashcode。如果x1 == x2或y1 == y2,请equals返回true。 然后创建一个HashSet<Pair>并添加所有对。根据你对平等的定义,最后集合中的内容将是所有不同的对。