From a97cb385e73b0315607217b251232f27bbfd60af Mon Sep 17 00:00:00 2001 From: Prasad-maker <65820623+Prasad-maker@users.noreply.github.com> Date: Tue, 21 Jul 2020 09:33:48 +0530 Subject: [PATCH] Update closest.py --- .../closest/closest.py | 51 +++++++++++++++++-- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/algorithmic_toolbox/week_4/03_divide_and_conquer_starter_files_20160804/closest/closest.py b/algorithmic_toolbox/week_4/03_divide_and_conquer_starter_files_20160804/closest/closest.py index 216f19f..0be9001 100644 --- a/algorithmic_toolbox/week_4/03_divide_and_conquer_starter_files_20160804/closest/closest.py +++ b/algorithmic_toolbox/week_4/03_divide_and_conquer_starter_files_20160804/closest/closest.py @@ -1,12 +1,53 @@ -# Uses python3 +#Uses python3 import sys import math -def minimum_distance(x, y): - # write your code here - return 10 ** 18 +def dist(p1, p2): + return float(math.sqrt((p1[0]- p2[0]) * (p1[0] - p2[0]) +(p1[1] - p2[1]) * (p1[1] - p2[1])) ) +def bruteForce(P, n): + min_val = float('inf') + for i in range(n): + for j in range(i + 1, n): + if dist(P[i], P[j]) < min_val: + min_val = dist(P[i], P[j]) + + return min_val + +def stripClosest(strip, size, d): + + # Initialize the minimum distance as d + min_val = d + + strip.sort(key = lambda p:p[1]) + i=0 + for x,y in strip: + j = i + 1 + while j < size and (strip [j][1] - strip[i][1]) < min_val: + min_val = dist(strip[i], strip[j]) + j += 1 + i+=1 + return min_val + +def closestUtil(X,Y): + P=zip(X,Y) + P=sorted(P) + Y=[y for _, y in P] + X=sorted(X) + n=len(X) + if n <= 3: + return bruteForce(P,len(P)) + mid = n // 2 + midPoint = P[mid] + dl = closestUtil(X[:mid], Y[:mid]) + dr = closestUtil(X[mid:], Y[mid:]) + d = min(dl, dr) + strip=[] + for i in range(n): + if abs(X[i] - X[mid]) < d: + strip.append((X[i],Y[i])) + return min(d, stripClosest(strip, len(strip), d)) if __name__ == '__main__': input = sys.stdin.read() @@ -14,4 +55,4 @@ def minimum_distance(x, y): n = data[0] x = data[1::2] y = data[2::2] - print("{0:.9f}".format(minimum_distance(x, y))) + print("{0:.9f}".format(closestUtil(x, y)))