码迷,mamicode.com
首页 > 其他好文 > 详细

closest

时间:2021-04-09 13:41:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tin   pen   datax   ret   star   cal   lmin   div   hold   

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))

 

closest

标签:tin   pen   datax   ret   star   cal   lmin   div   hold   

原文地址:https://www.cnblogs.com/hyffff/p/14636290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!