Я пытаюсь следовать этому методу для нахождения ближайшей пары точек, но в 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)