二叉堆/并查集

Written with StackEdit.

二叉堆

  • 完全二叉树
  • 优先从左边开始填充
  • empty或最小元素在根上
  • 子树也是堆

储存方式

一维数组
从[1]开始
层序排列
[k]的左儿子是2k
右是[2k+1]

操作

Delete Minimum
  1. 删除根
  2. 最后一个元素代替根元素
  3. 向下调整:选取当前节点和较小/大儿子(参考是小顶堆还是大)(通过下标定位),如果顺序不对则交换,直到顺序正确停止.
Insert
  1. 添加到末尾
  2. 向上调整:比较当前节点和父节点,如果次序不对交换.
Create
  1. 空列表
  2. 按顺序插入,向上调整.

应用

k路归并
  1. 将每个列表的第一个元素加入小根堆
  2. 导出最小的一个进结果列表,调整
  3. 从这个被导出的元素原所属序列中新增一个(如果有),调整
  4. Until…

时间复杂度为 n l o g k nlogk nlogk

序列和的前n小元素序列

给出两个长度为n的有序表A和B, 在A和B中 各任取一个, 可以得到n2个和. 求这些和最小的n个.
可以看作长为len(A)的有序表*len(B)

  • A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <=…
  • A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <=…
  • A[n]+B[1] <= A[n]+B[2] <= A[n]+B[3] <=…
  • 然后k路归并截取n项.

并查集

并查集维护一些不相交集合S={S1, S2, …, Sr}, 每个集合Sr都有一个特殊元素rep[Si], 称为集合代表.
用途:验证节点和修改后的节点的连通性

Exp.

  • 每个元素参与且仅参与一个集合
  • 每个集合间保证联通.
  • 每个集合有一个代表元素,作为根节点参与联通.
  • 不关心每个集合的结构,所以放在一个数组里也没差.
  • 上下级关系通过一个列表pre[n]维护.查找代表

操作

Makeset

创造一个新的集合{x}

Union

合并两个集合.

Findset

返回元素在集合中的代表.

例子以后加.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值