如何实现基于共享顶点的区域邻接查询函数?含列表元素匹配
实现基于共享顶点的相邻区域查找函数
看起来你想要实现一个通过共享顶点来识别相邻区域的功能,我来帮你梳理思路并给出具体的实现方案——既满足你提到的遍历分配ID、匹配顶点的思路,也提供更高效的优化方案。
核心逻辑梳理
两个区域只要共享至少一个顶点,就判定为相邻。我们可以分两步走:先给所有区域分配唯一ID(方便后续追踪和去重),再通过顶点关联找到相邻区域。
第一步:为区域分配唯一ID
先遍历你的regions列表,用setId给每个区域分配一个唯一标识(比如从0开始递增的整数),这样后续处理时能快速区分不同区域。
def assign_unique_ids(regions): # 遍历区域列表,为每个区域分配递增的ID for index, region in enumerate(regions): region.setId(index)
第二步:实现相邻区域查找
这里提供两种实现方式,你可以根据场景选择:
方案1:高效映射法(推荐)
通过构建「顶点→所属区域ID」的映射字典,避免重复遍历所有区域,大幅提升查询效率,尤其适合需要多次查询的场景。
- 先构建顶点映射:
def build_vertex_region_map(regions): vertex_map = {} for region in regions: region_id = region.getId() # 遍历当前区域的所有顶点 for vertex in region.getVertices(): # 把区域ID添加到对应顶点的列表中 if vertex not in vertex_map: vertex_map[vertex] = [] vertex_map[vertex].append(region_id) return vertex_map
- 基于映射查找相邻区域:
def get_adjacent_regions(target_region, regions, vertex_map): target_id = target_region.getId() adjacent_ids = set() # 收集目标区域所有顶点关联的区域ID for vertex in target_region.getVertices(): adjacent_ids.update(vertex_map.get(vertex, [])) # 移除自身ID,再找到对应的区域对象 adjacent_ids.discard(target_id) return [region for region in regions if region.getId() in adjacent_ids]
方案2:暴力遍历法(贴合你的初始思路)
直接按照你说的,双重循环遍历区域,逐个比较顶点是否共享。优点是逻辑直观,缺点是效率较低(适合区域数量少的场景)。
def get_adjacent_regions_bruteforce(target_region, regions): target_vertices = set(target_region.getVertices()) adjacent_regions = [] for region in regions: # 跳过自身 if region.getId() == target_region.getId(): continue # 检查是否有共享顶点 region_vertices = set(region.getVertices()) if target_vertices & region_vertices: # 两个顶点集合有交集 adjacent_regions.append(region) return adjacent_regions
辅助工具:判断两个区域是否共享顶点
如果你需要单独提取「元素与列表中任意元素比较」的逻辑,可以封装成一个简单的辅助函数:
def has_shared_vertex(region_a, region_b): vertices_a = set(region_a.getVertices()) vertices_b = set(region_b.getVertices()) # 检查两个顶点集合是否有交集 return bool(vertices_a.intersection(vertices_b))
使用示例
把这些函数整合起来的完整流程:
# 假设你已经有一个Region对象的列表regions assign_unique_ids(regions) vertex_map = build_vertex_region_map(regions) # 取第一个区域作为目标,查找它的相邻区域 target = regions[0] adjacent_regions = get_adjacent_regions(target, regions, vertex_map) # 输出结果 print(f"区域ID {target.getId()} 的相邻区域ID:") for region in adjacent_regions: print(f"- {region.getId()}")
内容的提问来源于stack exchange,提问作者Fedor Rumyantsev
相关产品推荐
相关产品推荐

