學習筆記 左偏樹

2022-08-22 14:54:11 字數 1301 閱讀 3239

左偏樹是乙個堆,為了實現快速合併的操作,我們可以構造一顆二叉樹,並且使右子樹盡量簡短

什麼是左偏呢?

定義:乙個左偏樹的外節點是乙個左子樹為空或者右子樹為空的節點,對於每乙個點定義乙個距離dist它為到它子樹內外節點的最短距離。

乙個合法的左偏樹節點需要滿足堆性以及它的右子樹的dist比左子樹的dist小。

為什麼要這樣呢?

這樣右子樹的dist是嚴格控制在logn以內的。

於是我們合併的時候,將另乙個左偏樹與當前左偏樹的右子樹合併,這樣遞迴下去,則時間複雜度是o(logn)的。

這就是一顆左偏樹啦

左偏樹的合併(merge)是logn的,merge用**比較好說

p.s.:**是小根堆,模板**是大根堆

**操作:insert(int x,int y) 在編號為x的左偏樹里插入權值為y的新節點

top(int x) 返回編號為x的左偏樹的堆頂的權值

pop(int x) 刪除編號為x的左偏樹的堆頂,返回新的堆頂編號

mergg(int x,int y)合併編號為x,y的兩顆左偏樹

#include#include

#include

#include

#define n 3010

using

namespace

std;

inttot;

struct

big_heaph[n];

inline

int init(int

x)inline insert(

int x,int

y)inline

int pop(int

x)inline

int top(int

x)inline

int merge(int x,int

y)inline

void

jimmy()

intmain()

左偏樹模板

// orz aireen

左偏樹學習筆記

左偏樹是一種基於二叉樹的可並堆。定義乙個節點的 距離 dis xdis x disx 為它到空節點的最短路長度,左偏樹強制要求 dis lson dis rson dis ge dis dislso n d isrs on 所以 dis x di srso n 1dis x dis 1 disx d...

左偏樹 學習筆記

首先要知道左偏樹是用來幹什麼的。如果給我們兩個優先序列,然後讓我把這兩個優先佇列合併成乙個優先佇列。如果直接用堆,就是將乙個佇列裡面的數不斷彈出然後扔到另乙個佇列裡。複雜度是 o n n為佇列中數的個數。但是用左偏樹就可以做到 log n 1 n 2 ps 為了便於討論,本文所有的左偏樹均已小根樹為...

學習筆記 左偏樹

左偏樹是一種可並堆,除了堆的基本功能,最大的特點就是支援合併堆,甚至比普通堆好寫。下面敘述以小根堆為例,大根堆對稱。o log n 求乙個數所在堆的根 o 1 求最小值 o log n 合併兩個堆 o log n 刪除最小值 o log n 插入乙個數 n 是插入的總節點數 或當前堆的節點數 str...