STL问题:如果使用nth_element选出有重复元素的第N个元素?

starwing83 2008-06-26 04:27:43
比如有这么个数组int a[]={1, 1, 2, 2, 3, 3, };
传统的less<int>选第三个元素应该这么写nth_element(a,a+2,a+6);
这样选的结果是2,也就是说在排序以后,从小到大第二个元素是“2”。
现在我想把重复的算作一个元素,也就是让nth_element(a,a+2,a+6)能够返回3。一种办法是使用unique来去重,然后再nth_element,还有一种办法(我认为)是合理构造一个comp函数,使得nth_element能“跳过”重复的元素。因为我只是想选出那个元素而已,其他多余的操作不想做。想在O(n)的时间内完成这个。该怎么做呢?
...全文
381 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
starwing83 2008-06-27
  • 打赏
  • 举报
回复
谢谢3#的方法,这种方法我想过,但是复杂度不理想。现在就是想,在不自己写划分的情况下,怎么让这个算法达到O(n)的复杂度?
starwing83 2008-06-27
  • 打赏
  • 举报
回复
啊……可能是我叙述得太简单了………………
我的意思是,要在将重复元素当作在一个“位置”的情况下,选出第N个元素。
a大小不定,元素未知并且无序,N也是不知道的。
如果仅仅是选第三个元素,自然一个for循环就够了。
表意不清,很抱歉~~~~
starwing83 2008-06-27
  • 打赏
  • 举报
回复
这样吗?还是谢谢了
看来,如果用STL,只能排序了,不过排序以后就用不着其他的处理了。

只能自己写快速划分了……还是谢谢大家~~结账了~~
Vitin 2008-06-27
  • 打赏
  • 举报
回复
这个,貌似很有难度。

首先设计comp函数不太可能重复数解决问题。毕竟comp只涉及一小部分,局限是比较大的。

另外,nth_element 和 unique 的平均时间复杂度都是O(n),这样整个算法已经达到了O(n)的复杂度了。
但是 unique 只能排除相邻的重复元素,不知是否符合楼主的要求(元素未知并且无序?未必只有相邻重复)。

建议楼主转到算法版问问,不用局限于 STL,先设计出符合要求的算法。
然后,可能可以选择合适的 STL 组件来实现该算法。
Gob00st 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
汗,一个简单的for循环即可。
nth_element不是干这活的。
[/Quote]
非要把简单问题复杂话就和unique_copy一起用:
int main()
{
int a[]={1, 1, 2, 2, 3, 3};
vector<int> vec(sizeof(a)/sizeof(int));
vec.erase(unique_copy(a,a+6,vec.begin()),vec.end());
nth_element(vec.begin(),vec.begin()+3,vec.end());
copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
return 0;
}
但是不推荐这么做
K行天下 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
汗,一个简单的for循环即可。
nth_element不是干这活的。
[/Quote]
也是哦
好像楼主是在把简单问题复杂化
taodm 2008-06-26
  • 打赏
  • 举报
回复
汗,一个简单的for循环即可。
nth_element不是干这活的。

65,201

社区成员

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

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