首页 > 其他分享 >数据结构 Trick 之:平衡树有交合并

数据结构 Trick 之:平衡树有交合并

时间:2025-01-18 12:43:42浏览次数:1  
标签:log int 合并 randd Trick 树有 数据结构 FHQ

能解决的问题类型

需要将两个值域有交可重集合并的问题。

优缺点

思路

这个 Trick 基于 FHQ。

首先,让我们回顾一下 FHQ 的 merge:

int merge(int l, int r) {
    if (node[l].randd <= node[r].randd) {
        pushdown(l);
        node[l].rs = merge(node[l].rs, r);
        pushup(l);
        return l;
    } else {
        pushdown(r);
        node[r].ls = merge(l, node[l].ls);
        pushup(r);
        return r;
    }
}

我们知道:这个东东只能解决不交合并,但是,我们可以受此启发。
我们在做不交合并是,将一整颗树和一个子树合并,就像这样:

那么我们是不是可以将其中一棵树分成两半,分别合并呢?(如下图)

这个合并复杂度几乎 \(O(n\,log\,n)\),极端情况下才会到 \(O(n\,log^2\,n)\),证明可以看这个

流程

  1. 找到 \(randd\) 小的那个根作为合并之后的树根。
  2. 将 \(randd\) 小的那个树按总树根进行分裂。
  3. 分裂左边跟总根的左子树合并,右边跟总根的右子树合并

代码

int Merge(int l, int r) {
	if (!l || !r) return l | r;
	int L, R;
	if (node[l].ran <= node[r].ran) {
		pushdown(l);
		split(r, L, R, node[l].v);
		node[l].ls = Merge(node[l].ls, L);
		node[l].rs = Merge(node[l].rs, R);
		pushup(l);
		return l;
	} else {
		pushdown(r);
		split(l, L, R, node[r].v);
		node[r].ls = Merge(node[r].ls, L);
		node[r].rs = Merge(node[r].rs, R);
		pushup(r);
		return r;
	}
}

标签:log,int,合并,randd,Trick,树有,数据结构,FHQ
From: https://www.cnblogs.com/porse114514/p/18678352

相关文章

  • [数据结构学习笔记15] 汉诺塔(Towers of Hanoi)
    汉诺塔是个古老的游戏,它可以用递归来解决。 关于汉诺塔的玩法和介绍,请参考这里。算法思想:1.目标是把最底下,最大的盘从起始柱子移到终点柱子2.那我们要先把除了最大的盘的其他盘子从起始柱子移到临时柱子上3.然后把最大的盘子从起始柱子移到终点柱子4.把除了最大盘的其......
  • C#数据结构与算法入门实战指南
    前言在编程领域,数据结构与算法是构建高效、可靠和可扩展软件系统的基石。它们对于提升程序性能、优化资源利用以及解决复杂问题具有至关重要的作用。今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望可以帮助到有需要的小伙伴。C#经典十大排序算法主要讲解C#经典十大......
  • 专升本数据结构看这一篇就够了!(重要章节已更新完毕,持续更新中...)
    重点章节已更新完毕,其他章节持续更新中,最新版本可以查看语雀考前须知考核形式:闭卷笔试,不能使用电脑编程试题类型:填空、选择、判断、简答、算法设计成绩占比:按章节:25%:绪论,串,数组和广义表,排序75%:线性表,栈和队列,树和二叉树,图,查找按能力:30%:识记......
  • C语言数据结构编程练习-单向不带头链表的操作
    单向链表单向链表是由若干个节点组成的数据结构,每个节点包含两个部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。  #include"03.h"voidfn3(){ intorder=0; elementTypeval; elementTypeelementVal; LinkNode*ListNode=NULL; ......
  • C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作
     使用多文件进行编程main.c文件#include"02.h"intmain(){ fn2(); return0;} 02.h 头文件#pragmaonce#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<memory.h>#defineMAX_NUMBER100typedefi......
  • 数据结构学习记录-数据结构概念
    1数据结构:数据结构是计算机存储,管理数据的方式。数据必须依据某种逻辑联系组织在一起存储在计算机内数据结构研究的就是这种数据的存储结构和数据的逻辑结构。1.1数据的逻辑结构:逻辑结构指的是数据本身之间的关系集合:数据元素除了属于同一个集合外,没有其他联系;线性关......
  • [数据结构学习笔记13] 递归简介(Recursion)
    递归让我们把问题由大分小,小到我们能够轻松处理。递归方法有两个要注意的点:1.递归方法会重复的被调用;2.必须有一个终止条件,否则方法调用不停,会导致stackoverflow。看下面的一个例子,这个没有终止条件,会报错!functionhello(){console.log("I'malittlefunction,shorta......
  • 科普文:算法和数据结构系列【压缩和通信利器:哈夫曼树(Huffman Tree)java示例代码解读】
    概叙科普文:算法和数据结构系列【算法和数据结构概叙】-CSDN博客科普文:算法和数据结构系列【非线性数据结构:树Tree和堆Heap的原理、应用、以及java实现】-CSDN博客科普文:算法和数据结构系列【树:4叉树、N叉树】-CSDN博客科普文:算法和数据结构系列【二叉树总结-上篇:满二叉树、......
  • 【轻松掌握数据结构与算法】字符串算法(String Algorithms)
    字符串算法概述字符串匹配算法是计算机科学中的一个重要领域,主要用于在文本中查找特定模式(子字符串)的出现位置。这些算法在文本编辑器、搜索引擎、生物信息学等领域有广泛的应用。暴力法(BruteForceMethod)暴力法是最直接的字符串匹配算法,它通过逐个字符比较来查找模式在文......
  • 初阶数据结构【队列及其接口的实现】
    目录前言一、队列的概念及结构二、队列的实现方式三、队列的实现3.1基本结构3.2队列基本功能接口初始化队列销毁队列3.3入队列接口3.4出队列接口3.5队列的其它接口获取队列头部元素获取队列队尾元素检测队列是否为空获取队列中有效元素个数3.6测试总结前言......