Метод «разделяй и властвуй» для ближайшей пары точек - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь следовать этому методу для нахождения ближайшей пары точек, но в 10% случайно сгенерированных случаев ответы от метода грубой силы и метода "разделяй и властвуй"т совпадают. Я не понимаю, что я делаю неправильно. Вот что я сделал:

def efficient_closest_pair_routine(points):
    p_x=points
    p_y=sort_points_by_Y(points)
    n=len(points)

    if n<=3:
        return naive_closest_pair(p_x)

    mid=n//2
    s1=p_x[:mid]
    s2=p_y[mid:]

    (d1,a1,b1)=efficient_closest_pair_routine(s1)
    (d2,a2,b2)=efficient_closest_pair_routine(s2)

    if d1<=d2:
        d=d1
        c_pair=(a1,b1)
    else:
        d=d2
        c_pair=(a2,b2)
    strip=find_strip_points(p_x,d)
    flag=closest_pair_in_strip(strip,d)
    if flag==-1:
        return (d,c_pair[0],c_pair[1])
    else:
        return flag

def find_strip_points(points,d):
    p_y=sort_points_by_Y(points)
    l=len(points)
    m_x=points[l//2][0]
    strip=[]
    for i in p_y:
        if m_x-d<=i[0]<=m_x+d:
            strip.append(i)
    return strip

def closest_pair_in_strip(points, d):
    flag=-1
    l_strip=len(points)
    for i in range(l_strip-1):
        for j in range(i+1,min(i+7,l_strip)):
            p,q=points[i],points[j]
            D=dist(p,q)
            if D<d:
                flag+=1
                c_pair=(p,q)
                d=D

    if flag==-1:
        return flag
    else:
        return (d,c_pair[0],c_pair[1])

def efficient_closest_pair(points):

    points_x=sort_points_by_X(points)
    return efficient_closest_pair_routine(points_x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...