首页 > 其他分享 >DSU on tree

DSU on tree

时间:2023-06-11 14:02:42浏览次数:34  
标签:结点 遍历 复杂度 DSU tree 子树 为根 计算

图像1DSU on Tree

DSU on Tree 是指在树上利用类似于并查集的启发式合并的方法处理一类统计的问题。比如这些问题:对于每一个子树T,计算:

1)T中结点的值组成的众数

2)T中不同的结点的值的个数

3)T结点的值从小到大排序后最接近T的根结点的值

以子树中不同的结点的值的个数为例,如果直接对每一个子树T都从T的根结点用一次深度优先搜索遍历,时间复杂度会非常大(O(n2)),大部分图论题n都高达 105 ,显然不能用这种方法。

图像2

图像3

如果在计算以父结点P为根的子树的问题时候,能重复利用之前已经计算过的,以P的儿子为根的子树的信息,就可以减少一些遍历次数。但是由于有多个以儿子结点为根子树(T1、T2、……、Tn),为了计算每一个子树Ti的答案,必须舍弃其他子树的信息(否则就把其他子树的答案累加进去了,导致答案错误)。仔细观察后发现我们可以利用最后一个儿子结点为根的子树的信息。

如:为了计算以图中P结点为根的子树中颜色的数量,我们可以先求以s1为根的子树中颜色的数量、以s2为根的子树中颜色的数量、以s3为根的子树中颜色的数量。以前面两个儿子为根的子树(T1、T2)中的信息就被丢弃了,因为在计算第s2为根的子树时不能统计以s1为根的子树的颜色的数量,计算以s3为根的子树中颜色的数量的时候也必须丢弃以s2为根的子树留下的信息。只剩下以s3为根的子树留下的信息。

为了计算父结点P的答案,我们还必须重新统计以前两个儿子为根的子树中的结点的信息。为了让代价最小,我们可以让子结点数量最大的儿子最后计算。于是计算的过程就是:

计算过程

先遍历结点数量少的儿子并丢弃信息(记为A),再遍历结点数量多的儿子并保留信息(记为B),再回去遍历数量少的儿子(用于计算P的答案)并保留信息(记为C)。

复杂度

图像4这种贪心方法很明显,它的时间复杂度有多大却不明显。我们可以来考虑每一个结点会被遍历几次。一个结点只能在上面过程中(A)、(B)、(C)中被遍历,我们把过程B经过的边加粗。

通过观察可以发现,在第二层中,每一个结点会遍历 (1+x) 次(只用于计算自己的答案+用于计算别人的答案,x就是(A)过程中丢弃信息的次数。我们可以得到一个结点S的信息被丢弃的次数就是从根结点R到S的路径上细边的个数。

现在问题就是确定 (1+x) 的上界,从而确定时间复杂度。

假设整个树有n个结点,那么,每个细边的子树(s1、s3)大小应该是小于等于P的大小1/2的。我们记细边的子树大小为 n'n'1 ),那么 1n'n×(12)x=n×2xx 是从根结点R到s3的路径上细边的个数)。于是 2xn ,可以得到 xlog2n

每一个结点最多被遍历 (1+log2n)=O(logn) 次,如果每次遍历时间复杂度是 O(1) ,那么总的时间复杂度就是 O(nlogn)

标签:结点,遍历,复杂度,DSU,tree,子树,为根,计算
From: https://www.cnblogs.com/arith/p/17472858.html

相关文章

  • CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)
    前言考虑到B+树较为复杂,CMU15-445将B+树实验拆成了两部分,这篇博客将介绍Checkpoint#1部分的实现过程,搭配教材《DataBaseSystemConcepts》食用更佳。B+树索引许多查询只涉及文件中的少量记录,例如“找出物理系所有教师”的查询就只涉及教师记录中的一小部分,如果数据库......
  • odoo14在tree、kanban视图上添加dashboard
    效果图:  实现代码:js:view的类型原来1个js给拆分成了4个:view,controller,renderer,model​​1、view:AbstractView​​的子类,这是工厂类:类需要解析 ​​arch​​字段并设置其它3个类2、Renderer:渲染器,来自 ​​AbstractRenderer:负责在用户界面中展示数据;​​3、Contr......
  • git subtree的使用简介
    1、gitsubtree的使用简介gitsubtree是一个Git命令,用于在单个Git仓库中管理多个项目。它允许您将一个项目的子目录作为独立的Git仓库处理,同时仍然保持在主仓库中。这使得在不使用子模块的情况下,更容易地将多个项目组合在一个仓库中。以下是gitsubtree的一些常见用法:添加子树......
  • Python使用tkinter的Treeview组件实现表格功能
    fromtkinterimportTk,Scrollbar,Framefromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使......
  • CART——Classification And Regression Tree在python下的实现
    分类与回归树(CART——ClassificationAndRegressionTree))是一种非参数分类和回归方法,它通过构建二叉树达到预测目的。示例:1.样本数据集 2.运行结果-cart决策树的字典max_n_feats=3时tree_dict={house:{yes:agreen......
  • 【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索
    前言在OLAP实践中,在有数据更新的场景中,比如存储订单数据,我们经常会用到ReplaceingMergeTree引擎来去重数据,以获取数据的最新状态。但是ReplaceingMergeTree引擎实现数据的去重合并的操作是异步的,这样在实际查询的时候,其实是仍然有一部分数据是未进行合并的。为了保证统计数据的准......
  • xml qtreewidget 的遍历
    这些都是自己工作中遇到的,不具有普遍性 xml的递归遍历voidUserTreeWidget::travelDomElement(QDomElement&ele,QStringList&listOuterId){QDomNodenode=ele.firstChild();while(!node.isNull()){QDomElementchildElement=node.toElemen......
  • LSM-Tree (BigTable 的理论模型)[转]
    Google的BigTable架构在分布式结构化存储方面大名鼎鼎,其中的MergeDump模型在读写之间找到了一个较好的平衡点,很好的解决了webscale数据的读写问题。MergeDump的理论基础是LSM-Tree(Log-StructuredMerge-Tree),原文见:LSMTree下面先说一下LSM-Tree的基本思想,再记录下读文章的几......
  • Python tkinter 树形列表控件(Treeview)的使用简单举例,建立一个treeview
     importtkinterastkfromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=tk.Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使用Tree......
  • 外汇天眼:Invast Global股价格下跌至最低水平,FXStreet分拆公司设新办事处!
    截止到今天,2023年已过去一半。上半年和过去一年总体上对一些公开交易的经纪商来说相对较好,但对其他一些经纪商来说却是另一回事,比如上周INVInc公布了自己股价跌至近2年新低;之后是FXStreet将公司部门拆分,其营销机构在塞浦路斯设立办事处;Dukascopy将印度50指数退市。具体新闻如下:1、......