【发布时间】:2016-08-04 02:19:21
【问题描述】:
我正在尝试将一些元素存储到一个容器中,并希望根据某些标准有效地获取它。
简单来说,假设:
- 记录如下:(ID, Age, Wage)
- 每次插入和删除都会返回最低年龄的工资总和
点赞
ID Age Wage(k)
insert 1 23 95 // returns 23,95
insert 2 21 75 // returns 21,75
insert 3 27 85 // returns 21,75
insert 4 21 65 // returns 21,140
delete ID=2 // returns 21,65
我能想到几种解决方案:
1.向量 (boost::circular_buffer?)
e.g. [(23,1,95), (21,2,75), (27,3,85), (21,4,65)]
Insert: O(1)
Delete (can use a bit to mark deleted) O(n)
GetMinSum: O(n)
2.排序向量
e.g. [(21,2,75), (21,4,65), (23,1,95), (27,3,85)]
Insert: O(n)
Delete (can use a bit to mark deleted) O(n)
GetMinSum: O(1)
3.地图(RB 树)
std::map<age, vector<record>>
[(21)->[(2,75),(1,65)], (23)->[(1,95)], (27)->[(3,85)]]
GetMinSum: O(1)
Insert: O(logN)
Delete: O(n)
有什么建议吗?
【问题讨论】:
-
“有什么建议吗?”为了什么?更好的容器?你能澄清一下吗?
-
这个问题的任何部分都没有任何意义,包括您声称的算法运行时。
-
您可以在标准容器周围使用一些包装器,并在插入时更新最小值/最大值。
-
@Rakete1111 关于如何解决这个问题以获得最佳插入/删除/GetMinSum性能的建议
-
我会使用 #3 的变体,该类具有数据成员
std::map<Age, vector<Record>>其中struct Record { int ID; int Age; double Wage; };和返回所需信息的适当插入/删除方法。