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

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),我觉得比较浪费。
但关联容器是基于二叉树实现的,查找插入的位置时,应该用的是二分法查找,找到插入位置时,的确又不能确定前面有多少个元素。

不知道有没有高手研究过这个问题?
...全文
279 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)

64,636

社区成员

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

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