Python分治法解决最近对问题
- class nearestPoint:
- def __init__(self, aList):
- self.aList = aList
-
- def calculate(self):
- if self.aList == None or len(self.aList) == 0:
- return
- if len(self.aList) == 1:
- return 0
-
- global xRangeList, yRangeList
- xRangeList, yRangeList = self.Mergesort(self.aList, 0), self.Mergesort(self.aList, 1)
- return self.ClosestPair(xRangeList, yRangeList)
-
- def Mergesort(self, aList, axis):
- if len(aList) <= 1:
- return aList
- pivot = len(aList)//2
- leftArray = aList[:pivot]
- rightArray = aList[pivot:]
- return self.Merge(self.Mergesort(leftArray, axis), self.Mergesort(rightArray, axis), axis)
- def Merge(self, leftList, rightList, axis):
- output = []
- leftIndex, rightIndex = 0, 0
- while leftIndex < len(leftList) and rightIndex < len(rightList):
- if leftList[leftIndex][axis] < rightList[rightIndex][axis]:
- output.append(leftList[leftIndex])
- leftIndex += 1
- else:
- output.append(rightList[rightIndex])
- rightIndex += 1
- while leftIndex < len(leftList):
- output.append(leftList[leftIndex])
- leftIndex += 1
- while rightIndex < len(rightList):
- output.append(rightList[rightIndex])
- rightIndex += 1
- return output
-
- def ClosestPair(self, xList, yList):
- if len(xList) == 2:
- temp1 = ((xList[0][0]-xList[1][0])**2+(xList[0][1]-xList[1][1])**2)**0.5
- temp2 = ((yList[0][0]-yList[1][0])**2+(yList[0][1]-yList[1][1])**2)**0.5
- return min(temp1, temp2)
- elif len(xList) == 3:
- temp1 = min((xList[1][0] - xList[0][0])**2 + (xList[1][1] - xList[0][1])**2, (yList[1][0] - yList[0][0])**2 + (yList[1][1] - yList[0][1])**2)
- temp2 = min((xList[2][0] - xList[0][0])**2 + (xList[2][1] - xList[0][1])**2, (yList[2][0] - yList[0][0])**2 + (yList[2][1] - yList[0][1])**2)
- temp3 = min((xList[2][0] - xList[1][0])**2 + (xList[2][1] - xList[1][1])**2, (yList[2][0] - yList[1][0])**2 + (yList[2][1] - yList[1][1])**2)
- temp = min(temp1, temp2)
- return (min(temp, temp3))**0.5
- else:
- length = len(xList)
- pivot = length//2
- xLeft, xRight, yLeft, yRight = xList[:pivot], xList[pivot:], yList[:pivot], yList[pivot:]
- d1, d2 = self.ClosestPair(xLeft, yLeft), self.ClosestPair(xRight, yRight)
- d = min(d1, d2)
-
- m = xList[pivot][0]
- S = []
- for i in range(len(yList)):
- if abs(yList[i][0] - m) < d:
- S.append(yList[i])
- dminsq = d**2
- if len(S) > 2:
- for i in range(len(S)-1):
- k = i + 1
- while k <= len(S) - 1 and (S[k][1] - S[i][1])**2 < dminsq:
- dminsq = min((S[k][0]-S[i][0])**2+(S[k][1]-S[i][1])**2, dminsq)
- k += 1
- elif len(S) == 2:
- dminsq = min((S[1][0]-S[0][0])**2+(S[1][1]-S[0][1])**2, dminsq)
- return dminsq**0.5
-
-
-
- A = [[3.7,2.7],[6.9,10.2],[10.5,6.3],[2.0,5.2],[7.6,9.6],[6.4,6.8],[8.9,6.3],[4.8,9.9],[3.1,6.1],[5.3,5.8],[3.6,8.1],[2.9,3.7],[3.2,4.1],[4.7,3.9]]
- s = nearestPoint(A)
- print(s.calculate())
解压密码: detechn或detechn.com
免责声明
本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。
本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。