Algorithm 高效地列出网格中每一对唯一的点

Algorithm 高效地列出网格中每一对唯一的点,algorithm,grid,iteration,Algorithm,Grid,Iteration,看起来这是一个简单的问题,我正在寻找一种算法来列出网格中与原点不共线的每一对唯一的点。诀窍是以某种方式避免所有不同的对称性和巧合。这就是我到目前为止所做的: for( int x1 = 0; x1 <= s; x1++ ){ for( int y1 = 0; y1 <= s; y1++ ){ if( x1 == 0 && y1 == 0 ) continue; // P1 is coincident with origin fo

看起来这是一个简单的问题,我正在寻找一种算法来列出网格中与原点不共线的每一对唯一的点。诀窍是以某种方式避免所有不同的对称性和巧合。这就是我到目前为止所做的:

for( int x1 = 0; x1 <= s; x1++ ){
    for( int y1 = 0; y1 <= s; y1++ ){
        if( x1 == 0 && y1 == 0 ) continue; // P1 is coincident with origin
        for( int x2 = x1; x2 <= s; x2++ ){
            for( int y2 = 0; y2 <= s; y2++ ){
                if( x1 == x2 && y2 >= y1 ) continue;
                if( x1 * y2 == x2 * y1 ) continue; // points are collinear with origin
                // this is a valid point
            }
        }
    }
}

for(int-x1=0;x1枚举所有唯一对(通过定义网格点上的顺序),忽略与原点对齐的对

def Pair(X0, Y0, X1, Y1):
    if X0 * Y1 != X1 * Y0:
        # Non collinear with the origin
        Accept(X0, Y0, X1, Y1)

# Enumerate all (X0, Y0)
for X0 in range(NX):
    for Y0 in range(NY):
        # Enumerate all (X1, Y1) > (X0, Y0) in the lexicographical sense

        # 1) X1 == X0, Y1 > Y0
        X1= X0
        for Y1 in range(Y0 + 1, NY):
            Pair(X0, Y0, X1, Y1)

        # 2) X1 > X0
        for X1 in range(X0 + 1, NX):
            for Y1 in range(NY):
                Pair(X0, Y0, X1, Y1)
或者更好:

# Enumerate all (X0, Y0)
for X0 in range(NX):
    for Y0 in range(NY):
        # Enumerate all (X1, Y1) > (X0, Y0) in the lexicographical sense
        for X1 in range(X0, NX):
            for Y1 in range(0 if X1 > X0 else Y0 + 1, NY):
                if X0 * Y1 != X1 * Y0:
                    # Non collinear with the origin
                    Accept(X0, Y0, X1, Y1)

不清楚你要的是什么。不
y2是的。关于这个过程的效率:生成了O(N^4)对;其中最多有O(N^3)对(想象一条从原点到第一点的线;它在最多N个其他点交叉)。不到1/N的对未通过测试,这个过程是最优的。它是O(N).N表示网格中的点对数。因此,例如,如果网格为20x30,则如果算法循环约600*600/2次,则为O(N)。