#from __future__ import division
from math import pow
from math import sqrt
class Point:
def __init__ ( self , x, y) :
self .x = x
self .y = y
def show( self ) :
return self .x , self .y
def calculateDistance( point1, point2) :
xDistance = point1.x - point2.x
yDistance = point1.y - point2.y
return sqrt( pow ( xDistance, 2 ) + pow ( yDistance, 2 ) )
"Points"
points = [ ]
points.append ( Point( 12 , 12 ) )
points.append ( Point( 103 , 101 ) )
points.append ( Point( 72 , 74 ) )
points.append ( Point( 0 , 0 ) )
points.append ( Point( 153 , 101 ) )
count = len ( points) # Amount of points
"I. Brute-force algorithm - O(n^2) time"
"http://e...content-available-to-author-only...a.org/wiki/Closest_pair_problem#Brute-force_algorithm"
print "\n " , "I. BRUTE FORCE"
minimumDistance = float ( 'inf' )
for i in range ( 0 , count) :
for j in range ( i + 1 , count) :
distance = calculateDistance( points[ i] , points[ j] )
print "Distance between " , i, " and " , j, " is " , distance
if distance < minimumDistance:
minimumDistance = distance
print "Result: " , minimumDistance
print "\n " , "#######################"
"II. Planar case - O(n log n) time"
"http://e...content-available-to-author-only...a.org/wiki/Closest_pair_problem#Planar_case"
print "\n " , "II. PLANAR CASE"
"1. Sort points by X value"
points.sort ( key= lambda point: point.x )
"sortedPoints = sorted(points, key=lambda point: point.x)"
"2. Split the set of points into two equal-sized subsets by X"
middle = count // 2 # Middle element's index
print "Middle index: " , middle
"3. Recursive function for step 4"
def rec( first, last) :
if first < last:
rec( first + 1 , last - 1 )
distance = calculateDistance( points[ first] , points[ last] )
print "Distance between " , first, " and " , last, " is " , distance
global minimumDistance # Hellish Satan! Damn Python scopes!
global i
global j
if distance < minimumDistance:
minimumDistance = distance
i = first
j = last
"4.1. Find the minimal distance in the left subset"
minimumDistance = float ( 'inf' )
rec( 0 , middle - 1 )
leftMinimumDistance = minimumDistance
leftPointPair = ( i, j)
"4.2. Find the minimal distance in the right subset"
minimumDistance = float ( 'inf' )
rec( middle, count - 1 )
rightMinimumDistance = minimumDistance
rightPointPair = ( i, j)
"5. Find the minimal distance among pairs in which one point lies on the left of the dividing vertical and the second point lies to the right"
averageMinimumDistance = float ( 'inf' )
for i in leftPointPair:
for j in rightPointPair:
# if i <> j:
distance = calculateDistance( points[ i] , points[ j] )
if distance < averageMinimumDistance:
averageMinimumDistance = distance
"6. Find the minimal distance among three distances"
minimumDistance = min ( leftMinimumDistance, rightMinimumDistance, averageMinimumDistance)
print "Result: " , minimumDistance
I2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KZnJvbSBtYXRoIGltcG9ydCBwb3cKZnJvbSBtYXRoIGltcG9ydCBzcXJ0CgpjbGFzcyBQb2ludDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKICAgICAgICBzZWxmLnggPSB4CiAgICAgICAgc2VsZi55ID0geQogICAgZGVmIHNob3coc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYueCwgc2VsZi55CgpkZWYgY2FsY3VsYXRlRGlzdGFuY2UocG9pbnQxLCBwb2ludDIpOgoJeERpc3RhbmNlID0gcG9pbnQxLnggLSBwb2ludDIueAoJeURpc3RhbmNlID0gcG9pbnQxLnkgLSBwb2ludDIueQoJcmV0dXJuIHNxcnQocG93KHhEaXN0YW5jZSwgMikgKyBwb3coeURpc3RhbmNlLCAyKSkKCiJQb2ludHMiCnBvaW50cyA9IFtdCnBvaW50cy5hcHBlbmQoUG9pbnQoMTIsIDEyKSkKcG9pbnRzLmFwcGVuZChQb2ludCgxMDMsIDEwMSkpCnBvaW50cy5hcHBlbmQoUG9pbnQoNzIsIDc0KSkKcG9pbnRzLmFwcGVuZChQb2ludCgwLCAwKSkKcG9pbnRzLmFwcGVuZChQb2ludCgxNTMsIDEwMSkpCgoKY291bnQgPSBsZW4ocG9pbnRzKSAgIyBBbW91bnQgb2YgcG9pbnRzCgoiSS4gQnJ1dGUtZm9yY2UgYWxnb3JpdGhtIC0gTyhuXjIpIHRpbWUiCiJodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5vcmcvd2lraS9DbG9zZXN0X3BhaXJfcHJvYmxlbSNCcnV0ZS1mb3JjZV9hbGdvcml0aG0iCgpwcmludCAiXG4iLCAiSS4gQlJVVEUgRk9SQ0UiCm1pbmltdW1EaXN0YW5jZSA9IGZsb2F0KCdpbmYnKQpmb3IgaSBpbiByYW5nZSgwLCBjb3VudCk6Cglmb3IgaiBpbiByYW5nZShpICsgMSwgY291bnQpOgoJCWRpc3RhbmNlID0gY2FsY3VsYXRlRGlzdGFuY2UocG9pbnRzW2ldLCBwb2ludHNbal0pCgkJcHJpbnQgIkRpc3RhbmNlIGJldHdlZW4gIiwgaSwgIiBhbmQgIiwgaiwgIiBpcyAiLCBkaXN0YW5jZQoJCWlmIGRpc3RhbmNlIDwgbWluaW11bURpc3RhbmNlOgoJCQltaW5pbXVtRGlzdGFuY2UgPSBkaXN0YW5jZQpwcmludCAiUmVzdWx0OiAiLCBtaW5pbXVtRGlzdGFuY2UKCnByaW50ICJcbiIsICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKCiJJSS4gUGxhbmFyIGNhc2UgLSBPKG4gbG9nIG4pIHRpbWUiCiJodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5vcmcvd2lraS9DbG9zZXN0X3BhaXJfcHJvYmxlbSNQbGFuYXJfY2FzZSIKcHJpbnQgIlxuIiwgIklJLiBQTEFOQVIgQ0FTRSIKCiIxLiBTb3J0IHBvaW50cyBieSBYIHZhbHVlIgpwb2ludHMuc29ydChrZXk9bGFtYmRhIHBvaW50OiBwb2ludC54KQoic29ydGVkUG9pbnRzID0gc29ydGVkKHBvaW50cywga2V5PWxhbWJkYSBwb2ludDogcG9pbnQueCkiCgoiMi4gU3BsaXQgdGhlIHNldCBvZiBwb2ludHMgaW50byB0d28gZXF1YWwtc2l6ZWQgc3Vic2V0cyBieSBYIgptaWRkbGUgPSBjb3VudCAvLyAyICAjIE1pZGRsZSBlbGVtZW50J3MgaW5kZXgKcHJpbnQgIk1pZGRsZSBpbmRleDogIiwgbWlkZGxlCgoiMy4gUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBzdGVwIDQiCmRlZiByZWMoZmlyc3QsIGxhc3QpOgoJaWYgZmlyc3QgPCBsYXN0OgoJCXJlYyhmaXJzdCArIDEsIGxhc3QgLSAxKQoJCWRpc3RhbmNlID0gY2FsY3VsYXRlRGlzdGFuY2UocG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKQoJCXByaW50ICJEaXN0YW5jZSBiZXR3ZWVuICIsIGZpcnN0LCAiIGFuZCAiLCBsYXN0LCAiIGlzICIsIGRpc3RhbmNlCgkJZ2xvYmFsIG1pbmltdW1EaXN0YW5jZSAjIEhlbGxpc2ggU2F0YW4hIERhbW4gUHl0aG9uIHNjb3BlcyEKCQlnbG9iYWwgaQoJCWdsb2JhbCBqCgkJaWYgZGlzdGFuY2UgPCBtaW5pbXVtRGlzdGFuY2U6CgkJCW1pbmltdW1EaXN0YW5jZSA9IGRpc3RhbmNlCgkJCWkgPSBmaXJzdAoJCQlqID0gbGFzdAoKIjQuMS4gRmluZCB0aGUgbWluaW1hbCBkaXN0YW5jZSBpbiB0aGUgbGVmdCBzdWJzZXQiCm1pbmltdW1EaXN0YW5jZSA9IGZsb2F0KCdpbmYnKQpyZWMoMCwgbWlkZGxlIC0gMSkKbGVmdE1pbmltdW1EaXN0YW5jZSA9IG1pbmltdW1EaXN0YW5jZQpsZWZ0UG9pbnRQYWlyID0gKGksIGopCgoiNC4yLiBGaW5kIHRoZSBtaW5pbWFsIGRpc3RhbmNlIGluIHRoZSByaWdodCBzdWJzZXQiCm1pbmltdW1EaXN0YW5jZSA9IGZsb2F0KCdpbmYnKQpyZWMobWlkZGxlLCBjb3VudCAtIDEpCnJpZ2h0TWluaW11bURpc3RhbmNlID0gbWluaW11bURpc3RhbmNlCnJpZ2h0UG9pbnRQYWlyID0gKGksIGopCgoiNS4gRmluZCB0aGUgbWluaW1hbCBkaXN0YW5jZSBhbW9uZyBwYWlycyBpbiB3aGljaCBvbmUgcG9pbnQgbGllcyBvbiB0aGUgbGVmdCBvZiB0aGUgZGl2aWRpbmcgdmVydGljYWwgYW5kIHRoZSBzZWNvbmQgcG9pbnQgbGllcyB0byB0aGUgcmlnaHQiCmF2ZXJhZ2VNaW5pbXVtRGlzdGFuY2UgPSBmbG9hdCgnaW5mJykKZm9yIGkgaW4gbGVmdFBvaW50UGFpcjoKCWZvciBqIGluIHJpZ2h0UG9pbnRQYWlyOgoJCSMgaWYgaSA8PiBqOgoJCWRpc3RhbmNlID0gY2FsY3VsYXRlRGlzdGFuY2UocG9pbnRzW2ldLCBwb2ludHNbal0pCgkJaWYgZGlzdGFuY2UgPCBhdmVyYWdlTWluaW11bURpc3RhbmNlOgoJCQlhdmVyYWdlTWluaW11bURpc3RhbmNlID0gZGlzdGFuY2UKCiI2LiBGaW5kIHRoZSBtaW5pbWFsIGRpc3RhbmNlIGFtb25nIHRocmVlIGRpc3RhbmNlcyIKbWluaW11bURpc3RhbmNlID0gbWluKGxlZnRNaW5pbXVtRGlzdGFuY2UsIHJpZ2h0TWluaW11bURpc3RhbmNlLCBhdmVyYWdlTWluaW11bURpc3RhbmNlKQoKcHJpbnQgIlJlc3VsdDogIiwgbWluaW11bURpc3RhbmNl