当前位置: 首页 > news >正文

郭其先生利用DeepSeek实现的PostgreSQL递归CTE实现DFS写法

测试用表

CREATETABLEtree_nodes(idINTPRIMARYKEY,parent_idINTREFERENCEStree_nodes(id),nameVARCHAR(50));INSERTINTOtree_nodesVALUES(1,NULL,'根节点'),(2,1,'子节点1'),(3,1,'子节点2'),(4,2,'孙子节点1'),(5,2,'孙子节点2'),(6,3,'孙子节点3');

使用递归 CTE 实现 DFS:

WITHRECURSIVE dfsAS(-- 锚点:从根节点开始SELECTid,parent_id,name,1ASdepth,ARRAY[id]ASpath,ARRAY[name]::text[]ASpath_names,FALSEASis_cycleFROMtree_nodesWHEREparent_idISNULLUNIONALL-- 递归部分:深度优先遍历SELECTtn.id,tn.parent_id,tn.name,d.depth+1,d.path||tn.id,d.path_names||tn.name,tn.id=ANY(d.path)ASis_cycleFROMtree_nodes tnJOINdfs dONtn.parent_id=d.idWHERENOTd.is_cycle-- 防止循环)-- 按深度优先顺序输出SELECTid,parent_id,name,depth,path,path_namesFROMdfsORDERBYpath;

使用栈模拟 DFS

WITHRECURSIVE dfs_stackAS(-- 初始栈:包含根节点SELECT1ASstep,idAScurrent_node,name,ARRAY[id]ASstack,ARRAY[]::INT[]ASvisited,'visit'ASactionFROMtree_nodesWHEREparent_idISNULLUNIONALL-- 模拟栈操作:弹出、压入SELECTd.step+1,CASE-- 如果有未访问的子节点,访问第一个WHENEXISTS(SELECT1FROMtree_nodes tnWHEREtn.parent_id=d.current_nodeANDtn.id!=ALL(d.visited))THEN(SELECTtn.idFROMtree_nodes tnWHEREtn.parent_id=d.current_nodeANDtn.id!=ALL(d.visited)ORDERBYtn.idLIMIT1)-- 否则回溯ELSEd.stack[array_length(d.stack,1)-1]END,tn.name,CASE-- 访问新节点:压栈WHENEXISTS(SELECT1FROMtree_nodes tnWHEREtn.parent_id=d.current_nodeANDtn.id!=ALL(d.visited))THENd.stack||(SELECTtn.idFROMtree_nodes tnWHEREtn.parent_id=d.current_nodeANDtn.id!=ALL(d.visited)ORDERBYtn.idLIMIT1)-- 回溯:出栈ELSEd.stack[1:array_length(d.stack,1)-1]END,d.visited||d.current_node,CASEWHENEXISTS(SELECT1FROMtree_nodes tnWHEREtn.parent_id=d.current_nodeANDtn.id!=ALL(d.visited))THEN'push'ELSE'pop'ENDFROMdfs_stack dLEFTJOINtree_nodes tnONtn.id=d.current_nodeWHEREarray_length(d.stack,1)>0-- 栈不为空时继续)SELECTstep,current_node,name,stack,action,visitedFROMdfs_stackORDERBYstep;
http://www.jsqmd.com/news/227462/

相关文章:

  • PDF-Extract-Kit质量控制:确保提取结果准确
  • Keil4调试寄存器视图:图解说明使用技巧
  • HY-MT1.5实时翻译系统搭建:边缘计算最佳配置
  • 混元翻译1.5实战:电商商品描述多语言转换
  • Spring Boot文件上传
  • STM32CubeMX安装包Mac版多用户权限配置指南
  • PDF-Extract-Kit备份恢复:数据处理的安全保障
  • HY-MT1.5为何选择4090D?单卡部署算力适配深度解析
  • 腾讯HY-MT1.5应用:多语言客服系统搭建教程
  • HY-MT1.5-1.8B量化后精度保持技术揭秘
  • HY-MT1.5-1.8B边缘计算:车载系统实时翻译
  • 小模型大作为:HY-MT1.5-1.8B应用案例集锦
  • 从零实现GRBL移植:STM32开发实战案例
  • openmv与stm32通信配置流程:系统学习第一步
  • 多语言网站本地化:HY-MT1.5实战案例
  • LCD Image Converter入门必看:超详细版使用说明
  • LED驱动电路项目应用:5V供电下的小型化设计
  • Spring Boot整合Redisson的两种方式
  • 用BART微调医疗病历摘要更稳
  • 腾讯开源HY-MT1.5教程:上下文感知翻译实现
  • Keil5安装配置步骤详解:适合初学者的完整指南
  • STM32在Keil4中的Flash烧录问题解析
  • 腾讯HY-MT1.5 GPU配置指南:4090D性能调优
  • 腾讯开源模型部署:HY-MT1.5高可用方案设计
  • 混元翻译1.5模型实战:多语言视频字幕生成
  • 腾讯混元翻译模型HY-MT1.5:从入门到高阶部署完整指南
  • 新手教程:如何正确连接STLink与STM32芯片引脚
  • 工业控制板卡中上拉电阻布局布线规范:操作指南
  • HY-MT1.5性能深度:量化前后效果对比
  • HY-MT1.5-7B部署教程:4090D显卡配置最佳实践