有一个经验池,需要支持三种操作,共有 N 次操作:
+ id score
AI算力资源宝贵,在AI算法训练中,经验回放机制是通过存储和重用过去的经验数据来提高算法训练效率,以节省AI算力资源和提升算法训练迭代速度。为了进一步优化算法,我们使用优先级经验回放,根据每个经验的TD误差(TemporalDifferenceError)动态调整其采样优先级。你需要设计一个高效的数据结构和算法来支持以下操作:
插入经验:将新经验加入经验池子,并赋予初始优先级。
提取TopK经验:取出优先级最高的K个经验用于算法训练。提取经验操作后,经验池子中就少了已经提取出去的经验。若经验池中剩余的经验个数小于K,则返回−1。
更新优先级:根据训练后的TD误差,更新指定经验的优先级。每次更新优先级操作后,之前提取出来的经验又都回到经验池子中,即经验池子包含了所有插入过的经验,且优先级为最新更新后的优先级。
给定N个按时间顺序发生的操作(插入/提取/更新),请输出每次提取操作的结果。
第一行为整数N,表示操作总数。
接下来N行,每行表示一个操作:
insert id score:插入ID为id的经验,初始优先级为score。insert操作用+表示。
update id newScore:将ID为id的经验优先级更新为newScore。update操作用=表示。
extract k:提取当前优先级最高的k个经验id(按经验的优先级降序排列,若优先级相同则按id升序排列)。extract操作用−表示。
约束条件: 1≤N≤105
1≤id≤105(保证同一id不会被重复插入)
0<score,newScore≤109
1≤K≤10001
对每个extract操作,按顺序输出提取的id列表,用空格分隔。若有多次extract操作的输出,则后面的extract操作在前一次输出结果之后换行输出。注意:若extract操作的返回为−1,则输出−1。
若所有操作记录中没有extract操作,则返回null。
若入参的操作总数N和实际的操作行数不匹配,则返回null
输入
7
+ 1 5
+ 2 10
+ 3 7
- 2
= 3 20
- 1
- 1
输出
2 3
3
2
说明
初始经验池:[(1,5),(2,10),(3,7)] 提取Top2:2(10)→3(7)→输出2 3
更新后经验池:[(1,5),(2,10),(3,20)] 提取Top1:3(20)→输出3
经验池中剩余:[(1,5),(2,10)] 提取Top1:2(10)→输出2
输入
3
+ 1 5
+ 2 10
- 4
输出
-1
说明
插入了2个经验值,最后要提取4个经验值;池子中的经验值不够数量,故返回−1