[英]What is the most efficient searching algorithm to find the two values that are closest to the two values inputted by the user?
#用户输入的经度和纬度分别由变量“lon”和“lat”表示。 我想搜索“mintemparr”以找到离输入最近的位置。 我当前的算法遍历数组中的每个值以找到经度和纬度的最小差异,这需要很长时间,因为数组非常大。 有没有更有效的算法来做到这一点?
#一行“mintemparr”的格式为[经度,纬度,温度]。 我试图找到距离输入最近位置的温度。 我当前的算法遍历这个数组的每一行。
def match (lon, lat):
min=10000
minindex=-1
for x in range (len (mintemparr)):
if (abs ((float (lon))-float (mintemparr [x][0])))+(abs ((float
(lat))-float (mintemparr [x][1])))<min:
min=(abs ((float (lon))-float (mintemparr [x][0])))+(abs
((float (lat))-float (mintemparr [x][1])))
minindex=x
result=mintemparr [minindex][2]
print ("The Temperature is: ")
print (result)
longitude=input ("Enter Longitude: ")
latitude=input ("Enter Latitude: ")
match (longitude, latitude)
#样本输入:
Enter Longitude: -140
Enter Latitude: 40
#输出:
The Temperature is -6.3244445
#输出正确; 只是需要很长时间。
#mintemparr 排序后,经度从 -180 增加到 180,而纬度保持不变。 一旦到达 180 度,纬度就会增加并且模式继续。
#mintemparr的部分:
-179.979166666666657 89.9791666666666714 -3.39999995214436425e+38
-179.9375 89.9791666666666714 -3.39999995214436425e+38
-179.895833333333343 89.9791666666666714 -3.39999995214436425e+38
-179.854166666666657 89.9791666666666714 -3.39999995214436425e+38
-179.8125 89.9791666666666714 -3.39999995214436425e+38
-179.770833333333343 89.9791666666666714 -3.39999995214436425e+38
您可以将值附加到列表中,对其进行排序,然后取其左侧和右侧的值。 下面是一个例子:
lons=[float(i[0]) for i in mintemparr]
#check for nearest longtitude for lon:
lons.append(lon)
lons.sort()
mylon=lons[lons.index(lon)-1] if lon-lons[lons.index(lon)-1]< lons[lons.index(lon)+1]-lon else lons[lons.index(lon)+1]
背阔肌也一样:
mintemparr_temp=[i for i in mintemparr if i[0]==mylon]
lats=[float(i[1]) for i in mintemparr_temp]
#check for nearest longtitude for lon:
lats.append(lat)
lats.sort()
mylat=lats[lats.index(lat)-1] if lat-lats[lats.index(lat)-1]< lats[lats.index(lat)+1]-lat else lats[lats.index(lat)+1]
最后:
mytemp=[i for i in mintemparr if i[0]==mylon anf i[1]==mylat]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.