使用STL来模拟Treap的功能

本文介绍了如何利用STL来模拟Treap数据结构,以实现动态插入、删除和查询操作,所有操作的时间复杂度均为O(log n)。Treap结合了BST和最小堆的特性,通过在节点中维护key和priority来保持平衡。内容包括问题描述、要求及解决方案分析,提出使用两个map和一个set来满足最大value的O(1)查找需求。
摘要由CSDN通过智能技术生成

问题描述

我们知道,Treap可以完成节点的动态插入、删除、查询,其每个操作的时间复杂度是O(log n),因为其实现较红黑树更为简单,因此常常用于某些场合,以替换红黑树的实现。

Treap的每个节点维护了key, priority。

struct Node {
    int key;
    int priority;
    Node (int k, int p): key(k), priority(p) {}
}

key是作为BST的键值,用于支持快速的插入、删除和查询操作,而priority则是用于维护最小堆的性质。即从key层面上看,整个树是一个BST;从priority层面上看,则整个树是一个最小堆。

关于priority为何物?每当插入一个key值时,也会为它对应生成一个随机的priority。这个节点的插入操作分为两步:

  • 按BST树的性质插入节点(key, priority)
  • 插入完成后,按priority的值去zig-zap,以调整树的平衡性,这样最终生成的树是趋于平衡二叉树的

Treap除去支持insert, find, remove等,还支持快速地查找到最小的priority。于是我们又可以通过STL中的map,set等模拟之。

问题要求

  • insert(string key, int value),插入一个pair,时间复杂度要求为 O(log n)
  • lookup(string key), 查询,时间复杂度要求为O(log n)
  • remove(string key),删除一个节点,时间复杂度要求为O(log n)
  • max(),获得当前所有节点中最大的value,时间复杂度要求为O(1)

问题分析

显然,insert, find, remove 等方法就可以用BST搞定,比如直接使用STL的map(时间复杂度为O(log n),而STL的unordered_map时间复杂度为O(1)),但是max如何搞定呢?STL的map不支持对所有的value进行维护,比如取得最大值。

那么可以使用两个map+set来搞定,思路如下:

  • unordered_map<string, int> mp,用于O(1)的时间来对key进行查找
  • map<int, unordered
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值