当前位置: 代码迷 >> J2SE >> List集合中有一百万条数据,怎么快速查找相同的元素(集合中按数字算)
  详细解决方案

List集合中有一百万条数据,怎么快速查找相同的元素(集合中按数字算)

热度:81   发布时间:2016-04-23 19:40:04.0
List集合中有一百万条数据,如何快速查找相同的元素(集合中按数字算)
List集合中有一百万条数据,如何快速查找相同的元素(集合中按数字算),求大神给个思路
------解决思路----------------------
1、元素如果是实体,先重写equals方法
2、list排序
3、从beginIndex 到endIndex就是你要的元素了
int beginIndex = list.indexOf(obj);
int endIndex = list.lastIndexOf(obj);
------解决思路----------------------
我的思路有两种:
 1.将这100万条数据,通过hash分成几块小的数据,那么重复的数必然在同一个数据块内,然后在建立多个线程,每个线程处理一个数据块,先对每个数据块排序,然后二分查找。

2.因为一百万条数据比较多,可以用一个map来处理数据,键是数据,值是这个数据出现的次数,如果100万条的数据固定的话,可以考虑用bitmap但是java当中只有bitset,所以bitmap只能是自己来模拟了,然后通过map快速查找。
------解决思路----------------------
引用:
我的思路有两种:
 1.将这100万条数据,通过hash分成几块小的数据,那么重复的数必然在同一个数据块内,然后在建立多个线程,每个线程处理一个数据块,先对每个数据块排序,然后二分查找。

2.因为一百万条数据比较多,可以用一个map来处理数据,键是数据,值是这个数据出现的次数,如果100万条的数据固定的话,可以考虑用bitmap但是java当中只有bitset,所以bitmap只能是自己来模拟了,然后通过map快速查找。

顶,感觉可以解决这个问题,思路很明确,就是不知道这个代码实现算不算复杂
------解决思路----------------------
bitmap挺好,但是需要自己实现<span>#define WORD 8  
#define SHIFT 3 ////移动5个位,左移则相当于乘以8,右移相当于除以8取整    
#define MASK 0x07   
#define N 100000000    
char bitmap[1 + N / WORD];    
/*  
 * 置位函数——用"
------解决思路----------------------
"操作符,i&MASK相当于mod操作  
 * m mod n 运算,当n = 2的X次幂的时候,m mod n = m&(n-1)  
 */    
void set(int i) {    
    bitmap[i >> SHIFT] 
------解决思路----------------------
= (1 << (i & MASK));    
}    
/* 清除位操作,用&~操作符 */    
void clear(int i) {    
    bitmap[i >> SHIFT] &= ~(1 << (i & MASK));    
}    
/* 测试位操作用&操作符 */    
int test(int i) {    
    return bitmap[i >> SHIFT] & (1 << (i & MASK));    
}  </span>  <span>#define WORD 8  
#define SHIFT 3 ////移动5个位,左移则相当于乘以8,右移相当于除以8取整    
#define MASK 0x07   
#define N 100000000    
char bitmap[1 + N / WORD];    
/*  
 * 置位函数——用"
------解决思路----------------------
"操作符,i&MASK相当于mod操作  
 * m mod n 运算,当n = 2的X次幂的时候,m mod n = m&(n-1)  
 */    
void set(int i) {    
    bitmap[i >> SHIFT] 
------解决思路----------------------
= (1 << (i & MASK));    
}    
/* 清除位操作,用&~操作符 */    
void clear(int i) {    
    bitmap[i >> SHIFT] &= ~(1 << (i & MASK));    
}    
/* 测试位操作用&操作符 */    
int test(int i) {    
    return bitmap[i >> SHIFT] & (1 << (i & MASK));    
}  </span>
------解决思路----------------------
如果只求相同元素个数,6楼Set正解。
如果list本身是排序好了,直接二分查找就行。
如果需要查询元素的对象或下标等,顶18楼的,直接一次for循环,用map判断重复元素,然后把对象或下标存到map就行了。

其它的,先排序或转换等,再查找,不知道时间是否比直接for循环快。
  相关解决方案