树分治算法详解:从基础概念到实战应用
📅 2026/7/26 23:59:07
👁️ 次浏览
1. 什么是树分治树分治Tree Divide and Conquer是一种基于分治思想处理树形结构问题的算法范式。它将树分解为若干规模更小的子树分别解决子问题后再合并结果从而高效解决树上的路径统计、最值查询、动态规划等问题。2. 树分治的核心思想树分治的核心在于如何将树分而治之。主要有两种经典策略点分治每次选择树的重心作为分割点将原树分解为若干互不连通的子树保证子问题规模均衡。边分治选择一条边将树分成两个连通块递归处理两个子树。其中点分治更为常用因为它能保证递归深度为 O(log n)而边分治在菊花图中可能退化为 O(n)。3. 点分治算法框架点分治的基本流程如下在当前树中找到重心centroid计算经过重心的路径信息核心步骤删除重心递归处理各个连通块4. 经典应用树上路径统计以统计树上长度为 K 的路径数量为例展示点分治的实现#include bits/stdc.h using namespace std; const int N 1e5 5; vectorint g[N]; bool vis[N]; int sz[N], maxSubtree[N]; // 求子树大小和最大子树大小 void dfsSize(int u, int fa) { sz[u] 1; maxSubtree[u] 0; for (int v : g[u]) { if (v fa || vis[v]) continue; dfsSize(v, u); sz[u] sz[v]; maxSubtree[u] max(maxSubtree[u], sz[v]); } } // 找重心 int findCentroid(int u, int fa, int total) { for (int v : g[u]) { if (v fa || vis[v]) continue; if (sz[v] * 2 total) { return findCentroid(v, u, total); } } return u; } // 计算当前子树中所有节点到重心的距离 void getDistances(int u, int fa, int dist, vectorint distances) { distances.push_back(dist); for (int v : g[u]) { if (v fa || vis[v]) continue; getDistances(v, u, dist 1, distances); } } // 统计经过重心且长度为 K 的路径数量 int countPaths(int u, int K) { int res 0; vectorint allDistances; allDistances.push_back(0); // 重心自身 for (int v : g[u]) { if (vis[v]) continue; vectorint subDistances; getDistances(v, u, 1, subDistances); // 统计当前子树与之前子树的组合 for (int d : subDistances) { if (d K) { // 这里可以添加统计逻辑 } } // 合并到总距离列表 allDistances.insert(allDistances.end(), subDistances.begin(), subDistances.end()); } return res; } // 点分治主函数 int treeDivide(int u, int K) { dfsSize(u, -1); int centroid findCentroid(u, -1, sz[u]); vis[centroid] true; int ans countPaths(centroid, K); // 递归处理各个连通块 for (int v : g[centroid]) { if (vis[v]) continue; ans treeDivide(v, K); } return ans; }5. 时间复杂度分析点分治的时间复杂度通常为 O(n log n)每次找到重心后树的大小至少减半 → 递归深度 O(log n)每层需要 O(n) 时间处理所有节点总复杂度 O(n log n)实际复杂度还取决于具体问题的合并操作有时需要 O(n log² n) 或 O(n log n) 的额外数据结构。6. 常见变体与优化6.1 点分树动态点分治将每次找到的重心连接起来形成点分树支持带修改的查询操作。6.2 边分治 重构通过添加虚点将树转化为二叉树使边分治的递归深度稳定在 O(log n)。6.3 树上启发式合并DSU on Tree虽然不是严格的分治但思想类似利用重链剖分优化子树信息的合并。7. 实战例题以下是一些经典的树分治题目POJ 1741统计树上距离不超过 K 的点对数量Luogu P3806询问树上是否存在长度为 K 的路径Codeforces 321C给树节点赋值使得相邻节点值不同BZOJ 2599求树上长度为 K 的路径的最小边数8. 总结与技巧树分治的关键要点正确实现重心查找保证递归深度设计高效的信息合并方式避免重复计算注意去重防止同一路径被多次统计合理使用数据结构如数组、map、树状数组加速合并掌握树分治需要大量练习建议从模板题开始逐步挑战更复杂的问题。
1. 多任务学习的十年技术演进全景 2015年那会儿我刚接触多任务学习(MTL)时,学术界还在争论共享底层表征的合理性。十年后的今天,MTL已经成为工业界解决数据稀疏问题的标配方案。这期间经历了从硬参数共享到动态路由的技术跃迁&…
📅 2026/7/26 23:59:07
1. 什么是长链剖分长链剖分(Long Chain Decomposition)是一种针对有根树的链剖分方法,常用于解决树上与深度、距离相关的静态查询问题。与重链剖分(Heavy-Light Decomposition)不同,长链剖分优先选择子树中…
📅 2026/7/26 23:59:07
1. 什么是树链剖分?树链剖分(Tree Chain Partition,简称树剖)是一种将树形结构转化为线性序列的算法技巧。它通过将树上的路径分解为若干条“重链”,使得原本在树上难以高效处理的路径查询、路径修改等问题,…
📅 2026/7/26 23:59:07
转载
Windows 7/XP系统在局域网文件共享设置方法-联想知识库https://iknow.lenovo.com.cn/detail/C192232.html
📅 2026/7/27 1:30:43
1. 企业AI定制开发的真实成本解析当企业考虑引入AI解决方案时,最常问的第一个问题就是"这要花多少钱?"但这个问题就像问"装修一套房子要多少钱"一样难以简单回答。根据我们团队过去三年为47家企业实施AI定制的经验,项目成…
📅 2026/7/27 1:30:43
1. 项目概述与核心价值在嵌入式系统,尤其是高性能多核DSP的设计与应用中,电源管理和复位机制绝非简单的“上电开机”和“按键重启”。它们是一套精密、严谨的硬件协议,直接决定了芯片能否从“沉睡”状态安全、稳定地“苏醒”并进入可控的工作…
📅 2026/7/27 1:30:43
Genshin_StarRail_fps_unlocker:游戏帧率解锁终极解决方案 【免费下载链接】Genshin_StarRail_fps_unlocker Genshin Impact & HKSR Fps Unlock 原神崩铁帧率解锁 项目地址: https://gitcode.com/gh_mirrors/ge/Genshin_StarRail_fps_unlocker
还在为《原…
📅 2026/7/27 1:30:43
AI 农业数据分析:气象数据 产量预测的跨界融合案例
一、农业数据分析的跨界吸引力
做数据分析久了,容易陷入"电商GMV、广告CTR、用户LTV"的舒适区。但去年一个机会让我接触到了农业数据分析——帮一个智慧农业项目做产量预测模型,…
📅 2026/7/27 1:30:43
一、引言:当65℃屋面成为工厂"热岛",隔热改造迫在眉睫2025年盛夏,江浙沪某钢结构厂房负责人李先生站在车间里,头顶彩钢瓦屋面温度飙升至65℃,空调与排风设备24小时高负荷运转,电费账单月月刷新纪…
📅 2026/7/27 1:29:43
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/26 7:10:22
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/26 5:10:17