对海量数据处理效率上有研究的进来看看!(切勿盖楼,瞎回帖,看清楚再说) 本帖最后由 adore_art 于 2011-12-18 00:07:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 List<Integer> list=new ArrayList<Integer>(); list.add(1); list.add(1); list.add(2); System.out.println(list.size());//输入3 HashSet<Integer> h =new HashSet<Integer>(list); System.out.println(h.size());//输出2 List<Integer> list=new ArrayList<Integer>(); list.add(1); list.add(1); list.add(2); System.out.println(list.size());//输入3 HashSet<Integer> h =new HashSet<Integer>(list); System.out.println(h.size());//输出2 由于手机号码长度为11位,我觉得用Trie树(又称字典树)就能解决这个问题。http://blog.csdn.net/smcwwh/article/details/5744053 感谢你们的留言,之前的就说过了不用到set和map之类的API.. 我并没有说用set/map的API来剔重,使用Trie树结构,插入操作最坏为N * 11(N=1000万),读取为M * 11(M为不重复的手机号码数量),并且读出的数据可以是排序好的。甚至你要统计出在这1000万个手机号码中,有重复的号码的重复次数都是轻而易举的。 构建这颗Trie树,需要的时间不短 楼主说尽量不用循环,我觉得不太现实吧,毕竟至少要循环一遍吧?1.trie树,建立好trie后就已经排重了。2.hash也是个不错的算法,可以用链表的方式处理冲突,如果发现hash值一样的话,你就查找下链表。冲突少得话,也是值得考虑的算法。3.bitmap算法也可以的。 public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> al = new ArrayList<String>(); al.add("a"); al.add("a"); al.add("a"); al.add("b"); al.add("a"); al.add("a"); al.add("c"); al.add("b"); for(int i = 0;i <al.size()-1;i++){ if(al.get(i).hashCode() == al.get(i+1).hashCode()) al.remove(i); } }只用了一层循环,不知可以不? 秒内是什么意思?1秒内?对于普通的堆表,数据库都没法在1s内完成千万级的数据去重最好是arraylist里的数据有序,这样就可以模拟聚簇表的方式处理 写了个Trie树,当数据量为100万时,大概2秒杀可以完成当数据量为1000万时,就悲剧了,内存和GC是颈瓶。惭愧 正在升级sdk 等下再回答你吧 字符串+ indexOf不知道性能如何,可以考虑按号段分成几个字符串,只要后面8位以提高效率. 感觉这个牛!应该可行,就是浪费空间--signature--------------------------http://www.purji.com/ 凌晨的时候不小心睡着了 现在再过来看 发现做不出 感觉还是map好 读取速度快 为什么java的子类中必须调用父类的构造方法。 如何学习网络通信协议 我定义了一个数组如题,在题中的元素20得不到统计,帮帮忙,我是要统计数组中每个元素出现的次数,并将该元素与出现次数输出 这个this是什么作用?如果不这样写还可以怎样? 想用多态机制画图可是遇到难题了~~ 同一段JSP程序为何在不同的文件夹下执行会有不同的结果? Java如何调用C++写的dll? 怎么让Timer暂停一会儿? Hashmap底层数据存储的困惑 关于图标 自学java 搭建S2SH报错 希望大神们帮忙解答.. java while循环问题
list.add(1);
list.add(1);
list.add(2);
System.out.println(list.size());//输入3
HashSet<Integer> h =new HashSet<Integer>(list);
System.out.println(h.size());//输出2
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(1);
list.add(2);
System.out.println(list.size());//输入3
HashSet<Integer> h =new HashSet<Integer>(list);
System.out.println(h.size());//输出2
我觉得用Trie树(又称字典树)就能解决这个问题。
http://blog.csdn.net/smcwwh/article/details/5744053
使用Trie树结构,插入操作最坏为N * 11(N=1000万),
读取为M * 11(M为不重复的手机号码数量),并且读出的数据可以是排序好的。
甚至你要统计出在这1000万个手机号码中,有重复的号码的重复次数都是轻而易举的。
1.trie树,建立好trie后就已经排重了。
2.hash也是个不错的算法,可以用链表的方式处理冲突,如果发现hash值一样的话,你就查找下链表。冲突少得话,也是值得考虑的算法。
3.bitmap算法也可以的。
// TODO Auto-generated method stub
ArrayList<String> al = new ArrayList<String>();
al.add("a");
al.add("a");
al.add("a");
al.add("b");
al.add("a");
al.add("a");
al.add("c");
al.add("b");
for(int i = 0;i <al.size()-1;i++){
if(al.get(i).hashCode() == al.get(i+1).hashCode())
al.remove(i);
}
}
只用了一层循环,不知可以不?
1秒内?
对于普通的堆表,数据库都没法在1s内完成千万级的数据去重
最好是arraylist里的数据有序,这样就可以模拟聚簇表的方式处理
当数据量为100万时,大概2秒杀可以完成
当数据量为1000万时,就悲剧了,内存和GC是颈瓶。
惭愧
不知道性能如何,可以考虑按号段分成几个字符串,只要后面8位以提高效率.
http://www.purji.com/