news 2026/2/27 13:18:15

在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/2/28 8:23:49

【硬件设计】DC12V输入的防护+滤波设计

一、原理图二、问题思考1、为什么上图中有两个地&#xff0c;GND1和GND2&#xff1f; 2、图中的F1/D1/D2/L1作用是什么&#xff1f;如何进行选型&#xff1f;三、问题解答A1&#xff1a;为什么有两个地&#xff1f; GND1和GND是为了实现“地隔离”&#xff0c;GND1是与 VIN_12V…

作者头像 李华
网站建设 2026/2/27 23:29:43

快!太快了!一键生成!一键导出!微信自动统计数据报表来了!

每天都被琐碎的统计工作占用大量精力&#xff0c;明明忙到飞起&#xff0c;却连 “今天新增多少精准粉丝” 都答不上来 —— 这种失控感&#xff0c;真的太磨人了&#xff01;其实不用再手动记账、反复核对&#xff0c;一款靠谱的私域管理系统&#xff0c;就能帮你把所有微信数…

作者头像 李华
网站建设 2026/2/26 21:28:42

智能决策系统日志系统设计:AI架构师的调试与分析技巧

智能决策系统日志系统设计:AI架构师的调试与分析技巧 摘要 本文深入探讨智能决策系统中日志系统的设计原理与实践技巧。作为AI架构师,我们面临的核心挑战是如何在复杂的决策流水线中建立有效的可观测性机制。文章从第一性原理出发,系统分析智能决策系统的独特日志需求,提…

作者头像 李华
网站建设 2026/2/27 5:34:21

力扣 11.盛最多水的容器 简单的双指针算法 题解

题目描述给定一个长度为 n 的整数数组 a 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, a[i]) 。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。​ 输出容器可以储存的最大水量。**说明&#xff1a;**你不能倾斜容器。输入格式…

作者头像 李华
网站建设 2026/2/27 9:13:00

深度学习驱动的论文降重工具有效规避查重风险,智能改写段落

AI工具能否有效解决数学建模论文复现与排版难题&#xff1f;本文深度评测10款热门AI论文写作工具&#xff0c;助你快速找到高效助手&#xff0c;轻松应对时间紧、任务重的学术挑战。aibiye&#xff1a;专注于语法润色与结构优化&#xff0c;提升可读性aicheck&#xff1a;一键生…

作者头像 李华
网站建设 2026/2/27 6:18:51

温度传感器PT1000与NTC10K介绍

在模拟电路的温度测量领域&#xff0c;PT1000和NTC 10K是两种最常用的温度敏感元件。它们基于不同的物理原理&#xff0c;各有独特的特性、应用场景和设计考量。一、PT1000&#xff08;铂电阻温度传感器&#xff09;1、基本介绍PT1000是一种正温度系数&#xff08;PTC&#xff…

作者头像 李华