给定一组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 :(得分: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
。向图形添加边后,检查两个顶点:
如果x
和y
顶点都具有零度,则递增i
。
否则,对于度数正好为2的每个顶点,递减i
。
只要i > 0
存在一对满足您条件的对。
答案 3 :(得分:0)
这取决于您使用的语言,但在Java中,您可以创建Pair
类,并覆盖equals
和hashcode
。如果x1 == x2或y1 == y2,请equals
返回true
。
然后创建一个HashSet<Pair>
并添加所有对。根据你对平等的定义,最后集合中的内容将是所有不同的对。