用Java或C++编程实现10000个整数去重,效率要高些

补充一下还要把重复的元素找出来,再打印出来。... 补充一下还要把重复的元素找出来,再打印出来。 展开
 我来答
风若远去何人留
2013-07-19 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450126
专业C/C++软件开发

向TA提问 私信TA
展开全部
追求效率的话,肯定得用C++

整数有范围限制吗?如果范围小的话,可以打表,比如1000万以内的数字的话,用1M多的bit表就可以一次性筛选出来。int范围的话,用512M内存,可以一次循环扫过,但是内存开销太大
如果没有内存上的限制 这个方法绝对是最快的。而且也可以找到重复的

如果没有范围,或者范围太大,不适合达标,可以用C++ STL中的priority_queue 依次压入 然后弹出,有重复的去掉
追问
怎么个打表法,可不可以将程序大体写来看看
追答
假定内存足够,整数范围为正整数0-100万
那么每个Bit对应一个数字 100万需要内存为1000000/8=125000
程序可以写成这样
#include
unsigned char map[125000];
int main()
{
int i, a;
for(i = 0; i < 10000; i ++)
{
scanf("%d", &a);
if(map[a/8] & (1<<(a%8)))
printf("%d is repeat\n", a);
else map[a/8]|=1<<(a%8);
}
}

大致就是这样,从0开始计数,每个数值对应一位(1个bit),然后读入数据,如果没有记录过这个数据,那么这一位为0,把它置成1, 如果已经是1,表示这个数字是重复的

这种算法最大的优势就是快。一次循环搞定,而且所有操作都是位运算
缺点就是浪费内存,另外只能判断重复,却不能判断重复次数,重复一次和重复十次效果相同
chao1575639478
2013-07-19 · TA获得超过1391个赞
知道小有建树答主
回答量:353
采纳率:0%
帮助的人:221万
展开全部
public Set distinctData()
{
Map<String ,Object> map=new Map<String ,Object>();
for(int i=0;i<10000;i++)
{
String str=""+你的整数数据;
map.put(str,i);
}
return map.keySet();
}
for(String s: distinctData())
{
System.out.println(Integer.parseInt(s));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式