鲜花:《一种基于错误的寻找重心方法的点分治的复杂度分析》注

news/2025/3/16 19:24:59/文章来源:https://www.cnblogs.com/Kenma/p/18775271

原文:一种基于错误的寻找重心方法的点分治的复杂度分析

LCA 还是太神了,研究半天才看明白。

所以这里提供一种说人话版本。

为什么法一是错的?

原文提出了这样一个 hack:

这是三个等长度的共端点的链,初始以红色箭头所指的点为根。

进行第一次分治:

红色箭头所指的点是重心。

此时注意,初始根所在的链,也就是标红的链,我们寻找重心传入的点的总数是 \(\frac{2n}{3}\),也就是说,在进行下一次分治时,这条链上的点都符合条件。

进行第二次分治:

根据我们 dfs 的过程,虽然这条链上的点都符合条件,我们还是选择了深度最深的点作为重心,也就是红色箭头所指的点。

此时注意,我们下一次分治,传入的点的总数是这个点上方的点,也就是蓝色箭头所指的点,它的子树大小,也就是 \(2\)

此时我们找不到合法的重心。

为什么法二是对的?

首先考虑,法二求重心时,只考虑连通块内点的相对子树大小关系,也就是无论如何一定能找到一个点,并认为这个点是重心。

所以这种做法一定有正确性,所以我们现在只需要考虑复杂度问题。

为了方便研究,我们来考虑一种情况:

注意这里的变量名和原文有所不同。

其中,\(x\) 是上一层分治的选择的重心,\(x'\) 是上一次分治的根,\(k\) 是以 \(x\) 为根时,\(x'\) 所在的子树的根,\(k'\) 是以 \(k\) 为根时,\(x'\) 所在子树的根,\(a,b\) 分别是 \(x,k'\) 子树大小。

其实不需要对着定义抠字眼,直接看图就很明显。如果还是不明白,考虑分治重心的变化为:\(x' \to x \to k\) 子树内的点。

现在考虑的过程,是做完 \(x\),递归 \(k\) 子树(\(k\) 子树包括 \(k'\) 子树),寻找新的重心的过程。

考虑传入 \(k\) 子树的点数。

实际上,点数应当为:以 \(x\) 为根时,\(k\) 的子树大小,也就是 \(n-a\)。但是我们用的是:以 \(x'\) 为根时,\(k\) 的子树大小,也就是 \(n-b\)

我们考虑这个过程会进行很多层,对于每一层都会得到对应的 \(a,b\),形成 \(a,b\) 序列。

记第 \(i\) 层递归时,正确的点数为 \(N_i\),则有:

\[N_i=n-\sum_{j=1}^{i-1} a_j,N'_i=n-\sum_{j=1}^{i-2} a_j-b_{i-1} \]

注意原文中下标写混了,硬控我半小时。

关于序列 \(a,b\),我们有:

  • \(b_i \le a_i\)

考虑使用归纳法证明。

  1. \(i=1\) 时,\(a_i=b_i\)

  2. 下证 \(b_{i-1}\le a_{i-1}\) 时,\(b_i \le a_i\)

因为 \(b_{i-1} \le a_{i-1}\),所以 \(N_{i-1} \le N‘_{i-1}\)

考虑反证法,假设 \(b_i>a_i\)

又因为 \(N_{i-1} \le N'_{i-1}\),所以对于 \(x\) 来说,它计算出的最大子树,一定是 \(k\) 子树,所以 \(x\) 最大子树的大小一定 \(\ge b_i\)

进一步考虑,因为 \(b_i>a_i\),所以以 \(k\) 为根的最大子树一定严格小于以 \(x\) 为根的最大子树,也就是 \(k\) 而不是 \(x\) 应该是重心,这与条件矛盾,故假设不成立,原命题成立。

考虑感性理解,看图,如果 \(b_i>a_i\),那么 \(k\) 感觉上就比 \(x\) 更适合做重心。

  • \(2a_i \ge N_i\)

属于上一个结论的引申。仿照上例,假设 \(a_i < N_i-a_i\),那么 \(a_i < N'_i-a_i\),那么 \(x\) 的最大子树又变成了 \(k\) 子树,而根据上面的证明,\(x\) 的最大子树为 \(k\) 时,会出现矛盾。

因此,假设不成立,原命题成立。

结合上面两个结论,得到:\(2N_i \le N_{i-1}\),也就是说每次递归,\(N\) 的大小至少减半,因此递归总层数为 \(O(\log n)\),每层递归访问了 \(O(n)\) 个节点,总复杂度仍然为 \(O(n \log n)\)

但是听说这样写点分树,树高会出问题,不明白为什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot的WebServlet的兼容

一.使用SpringBean注册JavaWeb的三大组件 在 Spring Boot 中,使用 @Bean 注册的 Servlet、Filter 和 Listener 组件会被加载到 Servlet 容器 中管理,而不是直接由 Spring 容器管理。然而,Spring Boot 提供了一些机制来确保这些组件能够与 Spring 容器无缝集成。Servlet 容器…

第二章课上练习

TempConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in [F,f]: C = (eval(TempStr[0:-1]) - 32)/1.8 print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in [C,c]: F = 1.8*eval(TempStr[0:-1])+32 print("转换后…

叠加等边三角形

import turtle 设置画布和画笔 screen = turtle.Screen() screen.bgcolor("white") # 设置背景颜色 pen = turtle.Turtle() pen.shape("turtle") # 设置画笔形状为小乌龟 pen.color("blue") # 设置画笔颜色 pen.pensize(2) # 设置画笔…

Citia Composer2024软件下载与安装教程

CATIA是法国达索公司的产品开发旗舰解决方案。作为PLM协同解决方案的一个重要组成部分,CATIA软件具有以下主要功能和应用领域:‌设计‌:提供从概念设计到最终产品形成的完整设计能力,支持2D、3D、参数化混合建模及数据管理‌3。 ‌分析‌:进行产品分析和仿真,确保设计的可…

Peach-Printer2.0 Web 打印服务解决方案

Peach-Printer1.0在沉寂许久后迎来了一个使用客户,非常感谢客户的支持和理解。 通过客户的使用反馈本人尝试对1.0版本进行完善修改,但始终打印效果未能实现预期。思索许久后决心更改打印控件的底层框架,重新设计打印组件。通过一段时间的摸索与研究终于在3月11日推出了第一个…

老八股谈事务处理,到底在谈什么?

hello, 我是马甲哥, 这是我的第184篇原创技术文章, 也是周志明的软件架构课的读书笔记。 1. 事务处理的目标:数据状态的一致性 当我们谈事务处理,就是在谈确保数据状态的一致性Consistency。 一致性: 确保数据是正确的,不同数据间不会产生矛盾 (这里的一致性与分布式共…

信息论基础(持续更新)

熵、相对熵与互信息 熵 定义:一个离散型随机变量 \(X\) 的熵 \(H(X)\) 定义为: \[H(X)=-\sum_{x \in X}p(x) \log p(x) \]注释:\(X\) 的熵又可以理解为随机变量 \(\log \frac{1}{p(X)}\) 的期望值 引理\(H(X) \geq 0\) \(H_b(X)=(\log_ba)H_a(X)\)二元熵: \[H(X)= -p\log p…

数分笔记2

目录数项级数敛散性定义敛散性例:等比级数(几何级数)定理(级数 \(\sum a_n\) 的 Cauchy 收敛准测)例:\(p\)-级数(\(p>0\),实常数)命题“线性性”定义余项正项级数定义正项级数定理正项数列收敛的充要条件定理(比较原则)DAlembert(达朗贝尔判别法)(比式(比值)…

3.15总结

P1305 新二叉树 首先介绍一下何为先序遍历: 在二叉树中,对于每一对父亲与左右儿子,都按照{父亲,左儿子,右儿子}的顺序来遍历 例如有这样一棵树: 先序遍历的顺序:遍历1,输出“1” 遍历1的左儿子3,输出“3”遍历3的左儿子5,输出“5” 5没有左右儿子,返回3 遍历3的右儿…

SpringBoot配置文件的使用

一.全局文件配置 Spring Boot 使用全局配置文件来允许开发者自定义应用程序的配置。这些配置文件可以用来修改自动配置的设置,或者添加新的配置项。 配置文件的位置和命名:application.properties 或 application.yml:默认情况下,Spring Boot 会在以下位置查找配置文件,并…