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

如何创建具有线性缩放特性的六边形(环形)晶格?

线性复杂度生成环形六边形晶格的可行方案

你的思路完全可行

以“涡旋式迭代添加瓦片”的方式,确实能实现O(n)线性复杂度的环形六边形晶格生成——每一步仅处理当前新增的瓦片,无需遍历整个已生成的结构,完美规避NetworkX原生方法的二次复杂度问题。

具体实现步骤

  • 初始化核心环:先创建由6个瓦片组成的初始六边形环(对应第一张示例图),用轴向坐标(适配六边形结构的坐标系统)标记每个瓦片,同时建立核心环内部的邻接边。
  • 定向迭代扩展:沿着六边形的6个固定方向依次向外扩展,每一轮只处理当前的边缘瓦片集合:
    1. 遍历当前边缘的每个瓦片,在其空缺的邻接方向添加新瓦片
    2. 仅为新瓦片建立与相邻已存在瓦片的连接,无需全局更新
    3. 更新边缘瓦片集合为刚新增的瓦片,进入下一个方向的扩展
  • 坐标去重:用轴向坐标作为瓦片的唯一标识,避免重复创建相同位置的瓦片。

基于NetworkX的代码实现

import networkx as nx

def linear_hexagonal_ring(target_tiles):
    G = nx.Graph()
    # 六边形轴向坐标的6个邻接方向
    hex_directions = [(1, 0), (1, -1), (0, -1), (-1, 0), (-1, 1), (0, 1)]
    
    # 初始化6个瓦片的核心环
    core = [(1,0), (1,-1), (0,-1), (-1,0), (-1,1), (0,1)]
    G.add_nodes_from(core)
    # 连接核心环的相邻瓦片
    for i in range(6):
        G.add_edge(core[i], core[(i+1)%6])
    
    current_edge = core.copy()
    # 迭代扩展直到达到目标瓦片数
    while len(G.nodes) < target_tiles:
        new_edge = []
        for dir_idx in range(6):
            dx, dy = hex_directions[dir_idx]
            for tile in current_edge:
                x, y = tile
                new_tile = (x + dx, y + dy)
                if new_tile not in G:
                    G.add_node(new_tile)
                    G.add_edge(tile, new_tile)
                    new_edge.append(new_tile)
                    # 达到目标数就提前终止
                    if len(G.nodes) == target_tiles:
                        return G
        current_edge = new_edge
    return G

# 生成对应示例的结构
# 6个瓦片:linear_hexagonal_ring(6)
# 7个瓦片(添加1个后):linear_hexagonal_ring(7)
# 17个瓦片:linear_hexagonal_ring(17)

复杂度说明

这个实现中,每个瓦片仅被创建和连接一次,所有操作都是常数时间,整体复杂度严格随瓦片总数n线性增长,完全符合你的需求。

示例对应结构

  • 初始6个瓦片:显示6个瓦片
  • 添加1个瓦片后的环形结构:六边形晶格环
  • 17个瓦片的最终结构:17个瓦片的六边形晶格

内容的提问来源于stack exchange,提问作者user8110728

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:20:28