news 2026/6/9 21:04:42

在duckdb 递归CTE中实现深度优先搜索DFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在duckdb 递归CTE中实现深度优先搜索DFS

原帖地址 https://github.com/duckdb/duckdb/discussions/15386

通常的递归CTE都是广度优先搜索(BFS)

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),bfs(node,path)AS(SELECT1ASnode,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALLSELECTe.b,bft.path||[{'from': bft.node,'to': e.b}]FROMbfsASbft,edgesASeWHEREbft.node=e.a)SELECT*FROMbfs;┌───────┬────────────────────────────────────────────────────────────────────┐ │ node │ path │ │ int32 │ struct("from"integer,"to"integer)[]│ ├───────┼────────────────────────────────────────────────────────────────────┤ │1[]│ │2[{'from':1,'to':2}]│ │3[{'from':1,'to':3}]│ │4[{'from':1,'to':2},{'from':2,'to':4}]│ │5[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │6[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':6}]│ └───────┴────────────────────────────────────────────────────────────────────┘

DuckDB CTE模块的设计者kryonix提供了如下技巧提供DFS,但是还有问题,没有求出全部路径。

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),dfs(stack,path)AS(SELECT[1]ASstack,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALL(WITHsiblingsAS(SELECTARRAY_AGG(e.bORDERBYe.bASC)ASsiblings-- ^^^-- This determines the order of traversal of the siblingsFROMdfsASdft,edgesASeWHEREdft.stack[1]=e.a)SELECTx.*FROMsiblingsAS_(s),LATERAL(SELECTs||dft.stack[2:]ASstack,-- Push the stackdft.path||[{'from': dft.stack[1],'to': s[1]}]ASpath-- Add the edge to the pathFROMdfsASdftWHEREarray_length(s)>0-- There are more siblings to traverseUNIONALLSELECTdft.stack[2:],-- Pop the stack[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Reset the pathFROMdfsASdftWHEREarray_length(s)ISNULLANDdft.stack<>[]-- No more siblings to traverse)ASx))SELECT*FROMdfs;┌───────────┬────────────────────────────────────────────────────────────────────┐ │ stack │ path │ │ int32[]│ struct("from"integer,"to"integer)[]│ ├───────────┼────────────────────────────────────────────────────────────────────┤ │[1][]│ │[2,3][{'from':1,'to':2}]│ │[4,3][{'from':1,'to':2},{'from':2,'to':4}]│ │[5,6,3][{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │[6,3][]│ │[3][]│ │[][]│ └───────────┴────────────────────────────────────────────────────────────────────┘
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 17:26:39

评论笔记 - Cordova 与 OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 &#x1f4cc; 模块概述 评论笔记模块是MovieTracker应用中用于记录和管理影片评论的功能。用户可以为影片添加详细的评论笔记&#xff0c;记录观影感受、剧情分析、演员表现等。评论笔记支持编…

作者头像 李华
网站建设 2026/6/9 17:25:05

备份恢复模块 - Cordova与OpenHarmony混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 &#x1f4cc; 概述 备份恢复模块用于数据的备份和恢复。这个模块支持自动备份和手动备份&#xff0c;用户可以定期备份应用数据以防止数据丢失。通过Cordova框架&#xff0c;我们能够在Web层实…

作者头像 李华
网站建设 2026/6/8 21:37:32

排序--基数排序

一、不基于比较的排序算法 1.1、计数排序 这是一种另类排序&#xff0c;它不是基于比较的排序算法。比较小众&#xff0c;根据数据的分布情况&#xff0c;即频率。 1.2、基数排序 数据结构不统一&#xff0c;一般采用队列&#xff0c;先进先出。 比如[13,17,26,72,100],先找最高…

作者头像 李华
网站建设 2026/6/9 2:03:17

揭秘大模型深度研究:从多智能体协作到结构化报告生成的全流程

深度研究(Deep Research)已成为现代大模型平台的标准能力&#xff0c;通过多智能体协作完成长时间研究任务。文章解析了其高层架构(编排者、子代理、综合与引用代理)&#xff0c;对比了OpenAI、Gemini、Claude等平台的实现差异&#xff0c;详细阐述了从用户查询、初始规划、并行…

作者头像 李华
网站建设 2026/6/9 20:21:27

2026版大模型应用开发全攻略:零基础入门到精通,一篇文章搞定,非常详细收藏这一篇就够!

“ 大语言模型应用开发流程包括筛选应用场景、企业知识管理、训练场景大模型、业务系统融合、大模型安全体系建设、持续改进体验等多个环节。通过将AI智能体集成到数字化系统中&#xff0c;将业务数字化系统升级为智能化系统&#xff0c;从而实现人类员工与数字员工的高效协作。…

作者头像 李华