You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现基于共享顶点的区域邻接查询函数?含列表元素匹配

实现基于共享顶点的相邻区域查找函数

看起来你想要实现一个通过共享顶点来识别相邻区域的功能,我来帮你梳理思路并给出具体的实现方案——既满足你提到的遍历分配ID、匹配顶点的思路,也提供更高效的优化方案。

核心逻辑梳理

两个区域只要共享至少一个顶点,就判定为相邻。我们可以分两步走:先给所有区域分配唯一ID(方便后续追踪和去重),再通过顶点关联找到相邻区域。


第一步:为区域分配唯一ID

先遍历你的regions列表,用setId给每个区域分配一个唯一标识(比如从0开始递增的整数),这样后续处理时能快速区分不同区域。

def assign_unique_ids(regions):
    # 遍历区域列表,为每个区域分配递增的ID
    for index, region in enumerate(regions):
        region.setId(index)

第二步:实现相邻区域查找

这里提供两种实现方式,你可以根据场景选择:

方案1:高效映射法(推荐)

通过构建「顶点→所属区域ID」的映射字典,避免重复遍历所有区域,大幅提升查询效率,尤其适合需要多次查询的场景。

  1. 先构建顶点映射:
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
  1. 基于映射查找相邻区域:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:31:12