python - 给定列表中人员的二维坐标,我如何找到彼此之间的距离低于阈值的人?
问题描述
我有三元组列表:
- 姓名
- 坐标 x
- 坐标 y
混蛋是与列表中任何其他人的距离小于 2 的人。
我认为我的代码可以工作,但是由于嵌套循环,它的复杂性是 O(N²)。有没有可能让它更有效率?
people=[
('Mickey', 4.6, 3.2),
('Donald', 6.1, 3.2),
('Bambi', 6.2, 5.2),
('Goofy', 6.4, 2.0),
('Eeyore', 7.0, 6.4)]
min_distance_sq=2.**2
jerks=set()
for p1 in people:
if p1 in jerks:
continue
for p2 in people:
if p1[1]==p2[1]:
continue
distance_sq=(p1[2]-p2[2])**2+(p1[3]-p2[3])**2
if distance_sq < min_distance_sq:
jerks.add(p1)
jerks.add(p2)
break
for jerk in jerks:
print(jerk[0],'from',jerk[1],'is jerk')
解决方案
您可以构建某种二进制空间分区 (BSP) 数据结构。
例如,构建时间为 O(nlogn) 的kd 树,并对每个项目进行“最近邻”查询
推荐阅读
- java - 如何复制列表
进入java中的当前数组列表?(通用列表) - function - 识别 id 玩家 onclick unity
- vue.js - 使用 Vue.js 防止 DOM 刷新?
- python - Python pandas read_csv() utf-8 csv 文件,包含 EOF 和 NULL 字节
- android - react-native-webview:区分脚本引起的window.location和用户点击链接
- django - 为什么 ThreadedProcessPoolExecutor 卡住了?
- html - z-index 无法响应并定位固定侧边栏
- javascript - 如何在javascript中将下拉列表中的所有值转换为百万/十亿?
- r - 在R中将第一行除以第二行
- javascript - 无法在网页上看到下拉菜单?