news 2026/6/7 2:40:45

在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/7 4:43:00

Pi-hole广告拦截DNS搭建全网去广告方案

前言 Pi-hole是一款网络级广告拦截器&#xff0c;通过DNS过滤实现全网去广告。只需将设备DNS指向Pi-hole&#xff0c;即可拦截广告、追踪器和恶意网站。 一、Pi-hole原理 1.1 工作流程 设备请求 → Pi-hole DNS → 黑名单检查│├── 在黑名单 → 返回0.0.0.0&#xff08;广告…

作者头像 李华
网站建设 2026/6/1 21:59:05

多语言AI翻译引擎助力跨语种论文写作,保持学术术语准确性

还在为数学建模论文的复现和排版发愁&#xff1f;面对紧迫的时间和高难度任务&#xff0c;不妨试试这10款热门AI论文写作工具&#xff0c;它们能高效辅助你完成精准筛选和优化&#xff0c;让写作过程事半功倍。aibiye&#xff1a;专注于语法润色与结构优化&#xff0c;提升可读…

作者头像 李华
网站建设 2026/5/30 13:02:20

学术效率工具:6款AI论文平台推荐,智能处理使语言更清晰

开头总结工具对比&#xff08;技能4&#xff09; &#xfffd;&#xfffd; 为帮助学生们快速选出最适合的AI论文工具&#xff0c;我从处理速度、降重效果和核心优势三个维度&#xff0c;对比了6款热门网站&#xff0c;数据基于实际使用案例&#xff1a;工具名称处理速度降重幅…

作者头像 李华
网站建设 2026/6/6 23:56:57

高效学术工具:6个AI论文辅助系统,智能润色使内容更精准

开头总结工具对比&#xff08;技能4&#xff09; &#xfffd;&#xfffd; 为帮助学生们快速选出最适合的AI论文工具&#xff0c;我从处理速度、降重效果和核心优势三个维度&#xff0c;对比了6款热门网站&#xff0c;数据基于实际使用案例&#xff1a;工具名称处理速度降重幅…

作者头像 李华
网站建设 2026/6/4 20:00:03

宝,你越敢跟男人‘瞎要’,他越把你当宝

1. 你是要打游戏&#xff0c;还是要给我买奶茶。 2. 以后薯片归我&#xff0c;遥控器归我&#xff0c;你也归我。 3. 不好意思呀&#xff0c;聊得太投缘&#xff0c;想要个专属投喂员身份。 4. 想做你兜里的小馋猫&#xff0c;连打饱嗝都在卖萌。 5. 我希望我们是彼此的零食搭子…

作者头像 李华
网站建设 2026/6/3 23:46:27

C++ 函数与成员函数声明机制的深度剖析与演进全景报告

C 函数与成员函数声明机制的深度剖析与演进全景报告 1. 核心综述&#xff1a;声明作为接口契约的基石 在 C 编程语言的庞大语义体系中&#xff0c;函数声明&#xff08;Function Declaration&#xff09;不仅是连接调用方与实现方的接口契约&#xff0c;更是编译器执行类型检…

作者头像 李华