news 2026/4/23 8:36:24

DeepSeek对利用DuckDB求解Advent of Code 2021第9题“烟雾盆地”第二部分SQL的分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek对利用DuckDB求解Advent of Code 2021第9题“烟雾盆地”第二部分SQL的分析

这是DBatUTuebingen发布的。
源地址:https://github.com/DBatUTuebingen/Advent_of_Code


Advent of Code 2021 第9天

烟雾盆地

输入解析和低点计算放在共享文件smoke-basin.sql中(通过.read引入),两部分都会用到。

第一部分

用法:

$ duckdb < smoke-basin-part1.sql ┌────────────┐ │ risk level │ │ int128 │ ├────────────┤ │ 526 │ └────────────┘ 运行时间(秒):实际 0.000 用户 0.000190 系统 0.000082
第二部分

递归CTEflows本质上计算了二维洞穴网格上的连通分量(分量由高度为9的网格点分隔)。

关键优化:仅从第一部分找到的低点开始搜索连通分量(而不是从所有网格点开始)。参见递归CTEflows的初始查询q₀cavelowpoints的半连接。

用法:

在我的Mac Book Pro M2上大约需要30秒。

$ duckdb < smoke-basin-part2.sql ┌─────────┐ │ sizes │ │ int32 │ ├─────────┤ │ 1123524 │ └─────────┘ 运行时间(秒):实际 30.636 用户 23.693674 系统 6.924345

-- AoC 2021, Day 9 (Part 2)-- AoC 输入文件DROPMACROIFEXISTSinput;CREATEMACRO input()AS'input.txt';-- 引入共享的SQL文件,包含高度图解析和低点计算.readsmoke-basin.sql-- 开启计时器,并设置单线程运行(确保结果确定性).timeronSETthreads=1;WITHRECURSIVE-- 1. 为每个网格点分配一个唯一的盆地编号(basin),初始为行号cave(x,y,height,basin)AS(SELECTh.x,h.y,h.height,ROW_NUMBER()OVER()ASbasinFROMheightmapASh),-- 2. 递归CTE:模拟水流扩散,确定每个点属于哪个盆地flows(x,y,basin)AS(-- 初始查询:仅从低点开始扩散(优化关键)SELECTc.x,c.y,c.basinFROMcaveASc SEMIJOINlowpointsASlpON(c.y,c.x)=(lp.y,lp.x)UNIONALL-- 递归部分:从已访问点向四个相邻点扩散SELECTc.x,c.y,LEAST(f.basin,c.basin)ASbasinFROMflowsASf,caveAScWHERE(c.x,c.y)IN((f.x+1,f.y),(f.x-1,f.y),(f.x,f.y+1),(f.x,f.y-1))ANDc.height<9-- 只扩散到高度小于9的点(高度9为边界)),-- 3. 确定每个点的最终盆地编号(取扩散过程中遇到的最小编号)basins(x,y,basin)AS(SELECTf.x,f.y,MIN(f.basin)ASbasinFROMflowsASfGROUPBYf.y,f.x)-- 4. 计算前三大盆地大小的乘积SELECTPRODUCT(b.size)::intASsizesFROM(SELECTCOUNT(*)ASsizeFROMbasinsASbGROUPBYb.basin-- 按盆地分组统计大小ORDERBYsizeDESC-- 按大小降序排序LIMIT3)ASb;-- 取最大的三个盆地

SQL代码分析注释

  1. caveCTE

  2. flows递归CTE

  3. basinsCTE

  4. 最终查询

算法思路总结

该SQL通过递归CTE实现了基于低点的洪水填充算法(Flood Fill)

优化点在于仅从低点开始扩散,避免了从所有点开始的不必要计算,大幅提升了性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:33:31

YOLO在仓储物流中的应用:包裹分拣与堆垛机引导

YOLO在仓储物流中的应用&#xff1a;包裹分拣与堆垛机引导 在电商日均订单量突破亿级的今天&#xff0c;一个包裹从下单到送达用户手中&#xff0c;平均要在5个以上的自动化分拣中心流转。这些中心每小时处理数万件货物&#xff0c;传送带以超过2米/秒的速度运转——在这种近乎…

作者头像 李华
网站建设 2026/4/17 1:35:44

YOLO模型训练费用太高?试试我们的按小时GPU计费方案

YOLO模型训练费用太高&#xff1f;试试我们的按小时GPU计费方案 在AI视觉应用日益普及的今天&#xff0c;目标检测早已不再是实验室里的概念——它正驱动着工厂质检线上的自动化判断、支撑起无人配送车对障碍物的实时识别&#xff0c;也守护着城市角落的安全监控。而在这一系列…

作者头像 李华
网站建设 2026/4/18 18:52:42

YOLO实时检测系统搭建教程:零基础入门到上线

YOLO实时检测系统搭建&#xff1a;从零到上线的完整实践 在智能制造工厂的质检线上&#xff0c;摄像头正以每秒30帧的速度捕捉PCB板图像——成千上万个电子元件飞速闪过&#xff0c;任何微小的错件或缺件都可能造成整批产品返工。传统人工目检不仅效率低下&#xff0c;还容易因…

作者头像 李华