特定双亲节点对生成子节点的结构名称及Python实现方法
结构名称及Python实现方案
一、结构名称
你描述的这种结构是有向超图(Directed Hypergraph)的一个特例——具体是限定超边仅连接固定两个父节点到一个子节点的类型,也可以被称为二元产生式网络。它的核心特点是:单个节点可独立存在,只有当特定的节点配对出现时,才会触发生成对应的子节点,这和普通有向图中“单个节点指向另一节点”的逻辑完全不同。
二、Python实现方案
我们可以用字典存储配对与子节点的映射关系,同时用集合维护所有独立存在的节点,这种实现方式简单高效,能满足你描述的需求。
代码实现
class PairProductionGraph: def __init__(self): # 存储所有已存在的独立节点 self.nodes = set() # 存储产生式规则:键为有序节点对元组,值为对应的子节点 self.productions = {} def add_node(self, node): """添加一个独立节点""" self.nodes.add(node) def add_rule(self, parent_pair, child): """添加一条产生式规则:指定的双亲节点对生成子节点""" # 可选校验:确保双亲节点已被添加(如果不需要可以去掉) for p in parent_pair: if p not in self.nodes: raise ValueError(f"节点 {p} 尚未添加,请先调用add_node添加") self.productions[parent_pair] = child # 自动把子节点加入节点集合(也可以选择手动添加) self.nodes.add(child) def get_child(self, parent_pair): """查询指定节点对对应的子节点,无对应规则则返回None""" return self.productions.get(parent_pair) def generate_child(self, parent_pair): """根据规则生成子节点并返回,无规则则返回None""" child = self.get_child(parent_pair) if child: self.nodes.add(child) return child # 示例演示 if __name__ == "__main__": graph = PairProductionGraph() # 添加初始节点 initial_nodes = ['A', 'B', 'C', 'D', 'G'] for node in initial_nodes: graph.add_node(node) # 添加你示例中的所有产生式规则 graph.add_rule(('A', 'B'), 'E') graph.add_rule(('C', 'D'), 'E') graph.add_rule(('C', 'G'), 'H') graph.add_rule(('E', 'H'), 'I') # 测试查询 print(graph.get_child(('A', 'B'))) # 输出 E print(graph.get_child(('B', 'C'))) # 输出 None(不符合规则) # 查看所有节点 print(graph.nodes) # 输出 {'A', 'B', 'C', 'D', 'G', 'E', 'H', 'I'}
可选扩展
- 如果不需要区分节点对的顺序(比如
A+B和B+A都能生成E),可以把parent_pair转换成frozenset作为字典的键,修改add_rule和get_child中的键处理逻辑即可 - 要是需要可视化这个结构,可以用
networkx库,把每个产生式的两个父节点分别连到子节点,用边属性标注这是配对产生的关系
内容的提问来源于stack exchange,提问作者Kyle Meyers
相关产品推荐
相关产品推荐

