closest
时间:2021-04-09 13:41:22
收藏:0
阅读:0
import math
import random
import matplotlib.pyplot as plt
import time
limitx=300000
limity=300000
threshold=2
data=[]
datax=[]
datay=[]
datanum=20000
for i in range(datanum):
point=[]
x=random.random()*limitx
y=random.random()*limity
point.append(x)
point.append(y)
datax.append(x)
datay.append(y)
data.append(point)
#print(data)
plt.scatter(datax,datay,c=‘black‘)
plt.show()
a=-1
b=-1
minn=limitx*limity
def find(dataid,left,right):
#print(threshold)
global minn,a,b
localminn=100000000
if len(dataid)<threshold or right-left<10:
for i in dataid:
for j in dataid:
dis=(data[i][0]-data[j][0])*(data[i][0]-data[j][0])+(data[i][1]-data[j][1])*(data[i][1]-data[j][1])
dis=math.sqrt(dis)
if dis==0:
continue
if dis<minn:
a=i
b=j
minn=dis
localminn=dis
return localminn
mid=(left+right)/2
leftid=[]
rightid=[]
for i in dataid:
if data[i][0]<mid:
leftid.append(i)
else:
rightid.append(i)
resultl=find(leftid,left,mid)
resultr=find(rightid,mid,right)
d=min(resultr,resultl)
middleleftid=[]
middlerightid=[]
for i in leftid:
if data[i][0]>mid-d:
middleleftid.append(i)
for i in rightid:
if data[i][0]<mid+d:
middlerightid.append(i)
for i in middleleftid:
for j in middlerightid:
if data[i][1] - data[j][1]>d:
continue
dis = (data[i][0] - data[j][0]) * (data[i][0] - data[j][0]) + (data[i][1] - data[j][1]) * (
data[i][1] - data[j][1])
dis = math.sqrt(dis)
if dis < minn:
a = i
b = j
minn = dis
localminn = dis
return localminn
timestart=time.time()
find([i for i in range (datanum)],0,limitx)
timeend=time.time()
print(a)
print(b)
print(minn)
plt.clf()
plt.scatter(datax,datay,c=‘black‘)
size=0.01
plt.scatter(data[a][0],data[a][1],c=‘red‘)
plt.scatter(data[b][0],data[b][1],c=‘green‘)
plt.show()
print(‘timecost‘+str(timeend-timestart))
dataid=[i in range (datanum)]
timestart=time.time()
for i in dataid:
for j in dataid:
dis = (data[i][0] - data[j][0]) * (data[i][0] - data[j][0]) + (data[i][1] - data[j][1]) * (
data[i][1] - data[j][1])
dis = math.sqrt(dis)
if dis == 0:
continue
if dis < minn:
a = i
b = j
minn = dis
timeend=time.time()
print(a)
print(b)
print(minn)
print(‘timecost‘+str(timeend-timestart))
评论(0)