算法咨询:如何在插入到关联容器时,同时获得插入数据的位置?

Dream_lover 2008-04-02 09:46:01
我的需求如下:
用一个set记录每一次的插入数据,在插入当前数据的同时,还希望能获得当前插入数据在整个set中的位置。

目前能想到的方法:
inset(value);
//迭代
int index = 0;
SET::iterator ite = set.begin();
SET::iterator iteend = set.end();
while (ite != iteend && *ite != value)
{
++ite;
++index;
}

这个查找位置的算法时间复杂度为O(n),我觉得比较浪费。
但关联容器是基于二叉树实现的,查找插入的位置时,应该用的是二分法查找,找到插入位置时,的确又不能确定前面有多少个元素。

不知道有没有高手研究过这个问题?
...全文
366 34 打赏 收藏 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream_lover 2008-04-09
  • 打赏
  • 举报
回复
小结一下:
1。对自己的需求明确了一下,实际上,我在插入一个数据后,是想获得该数据在容器中的一个相当位置,比如在前20%之内。
2。根据明确下来的需求,采用了合适的实现方法:
根据我需要的比例值,计算出容器中相应的位置,获取该位置对应的iterator。
每次有新的数据插入时,直接和上面iterator对应的数据进行比较,判断是否在范围之内。
同时更新iterator对应的位置(我是逆序排列的,一般只需要往前移动一个位置)

这样算法的时间基本就是 数据插入的时间了。
双杯献酒 2008-04-03
  • 打赏
  • 举报
回复
关联容器,一般有一个自己的find方法,效率很高,
你不需要自己去循环
晨星 2008-04-03
  • 打赏
  • 举报
回复
是啊,鱼与熊掌通常是不可兼得的。
所以,你得搞清楚,在你的使用情形中,是插入删除多,还是随机访问多,亦或是关联查找多?
然后,针对那个最多的情形来做容器选型和优化。最后,在可能的情况下,也适当照顾一下少的情形就OK了。
skyful123 2008-04-03
  • 打赏
  • 举报
回复
顶一下 学到东西了~
Dream_lover 2008-04-02
  • 打赏
  • 举报
回复
有了迭代器, 就可以distance了, 不就得到个数了吗?

//这个的确是一个解决方法,可以得到我要的结果。 比我手工的循环要好,效率估计也会高一点。
//不过时间复杂度没有变化, 刚才看了distance的介绍和部分源码,对于关联容器来说,还是需要O(n)

//先谢过了,呵呵。
sheenl 2008-04-02
  • 打赏
  • 举报
回复
有了迭代器, 就可以distance了, 不就得到个数了吗?
Dream_lover 2008-04-02
  • 打赏
  • 举报
回复
to Chiyer:
我说的前面,是指排在该数据前面的。 也就是按数的遍历,排在前面的数据。
因为我的需求是考察一个数据在所有历史数据中的排名,从而决定该数据的权值。 所以需要知道排在前面的数据个数,同时,也需要将自己添加进去。

to sheenl && Supper_Jerry:
两位提到了用关联容器的find和insert方法,返回的都是iterator,据我的理解,根据iterator应该是得不到我期望的排在前面的数据个数吧?
iterator只是相当于一个指针,如果是vector这样顺序存储的, 用iterator-begin可以得到位置,但关联容器似乎不行吧?

to steedhorse:
我也考虑过用vector,不过每次插入一个数据都需要移动数据,开销也比较大。 这个实现应该是类似于我上面提到的链表方式。

to paidfighting:
这个需求是比较难,因为历史数据会快速增长的,所以时间当然是越少越好了。


谢谢各位的热心解答 :)
Supper_Jerry 2008-04-02
  • 打赏
  • 举报
回复
map就可以满足你的需要。直接赋值即可。取的时候o(logN)。
晨星 2008-04-02
  • 打赏
  • 举报
回复
排序数组就是排过序的数组,比如执行过sort的vector,不是什么东西。
sheenl 2008-04-02
  • 打赏
  • 举报
回复
用关联容器的find成员函数, O(log2N)
星羽 2008-04-02
  • 打赏
  • 举报
回复
但关联容器是基于二叉树实现的,查找插入的位置时,应该用的是二分法查找,找到插入位置时,的确又不能确定前面有多少个元素。

----------

既然是树,你说的前面是什么意思
paidfighting 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Dream_lover 的回复:]
排序数组是不是 类似插入排序?

比如实现一个有序链表,每次插入时,遍历链表,找到合适的位置,然后插入数据,同时,也可以得到新数据之前有多少个元素?

如果是这样,的确比用set效率会高一点,省略了插入时的查找时间,但时间复杂度没有变,还是O(n), 如果是常量级的时间复杂度就好了。
[/Quote]

lz,你又要知道位置,又要快速插入,还要常量级时间复杂度,太强人所难了吧。。
liveforme 2008-04-02
  • 打赏
  • 举报
回复
感觉上要插入合适的位置,set也好,链表也好,都要有O(n)的消耗的吧。。
Dream_lover 2008-04-02
  • 打赏
  • 举报
回复
排序数组是不是 类似插入排序?

比如实现一个有序链表,每次插入时,遍历链表,找到合适的位置,然后插入数据,同时,也可以得到新数据之前有多少个元素?

如果是这样,的确比用set效率会高一点,省略了插入时的查找时间,但时间复杂度没有变,还是O(n), 如果是常量级的时间复杂度就好了。
Dream_lover 2008-04-02
  • 打赏
  • 举报
回复
to taodm:
如果你真的在乎“前面有多少个元素”,那么你就不该用关联容器。
你也许应该使用排序数组。

我之前还没有听说过排序数组,能不能介绍一下这个是什么东东?
paidfighting 2008-04-02
  • 打赏
  • 举报
回复
mark
taodm 2008-04-02
  • 打赏
  • 举报
回复
如果你真的在乎“前面有多少个元素”,那么你就不该用关联容器。
你也许应该使用排序数组。
starcbh 2008-04-02
  • 打赏
  • 举报
回复
deque
Dream_lover 2008-04-02
  • 打赏
  • 举报
回复
map+distance

其中插入数据是O(logN),而distance,就我的理解,是O(N)
paidfighting 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 Dream_lover 的回复:]
兄台这个意见很中肯,谢谢,我稍后进行测试。

只是从理论上说,这三个时间复杂度差不多,如果能有一个O(logN)就更好了。
[/Quote]

taodm不是说了map是O(logN)了么
加载更多回复(14)
内容概要:本文介绍了使用电磁暂态程序(EMTP)对电力变压器在多种运行情景下进行建模与仿真分析的研究,涵盖正常运行、一次绕组故障以及铁芯故障等典型工况。通过Matlab代码实现,构建了高精度的变压器电磁暂态模型,能够精确模拟其内部电压、电流的动态变化过程,有效评估变压器在不同故障条件下的响应特性与系统稳定性。该研究不仅为变压器的故障诊断提供了可靠的仿真手段,也为电力系统中关键设备的设计优化、运行维护及保护策略开发提供了有力的理论支撑和技术路径。; 适合人群:具备电力系统分析基础知识和Matlab编程能力的高校师生、科研人员及从事电力系统仿真与设备状态监测的工程技术人员。; 使用场景及目标:①应用于高校教学与课程设计,帮助学生深入理解变压器的工作原理与典型故障机理;②服务于科研机构,支持新型变压器保护算法与故障识别技术的开发与验证;③助力电力企业开展设备健康状态评估、故障预警与运维决策,提升电网运行的安全性与可靠性。; 阅读建议:读者应结合文中提供的Matlab代码进行实践操作,重点观察并分析不同故障场景下系统电气量的暂态响应特征,深入掌握EMTP在电力系统电磁暂态分析中的建模方法与应用技巧。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧