i***r 发帖数: 1035 | 1 有2列随机数字(不重复),很大比如2个G,排序之后,我想找出所有共同的数字,比
如A开头可能是:
1
2
3
7
10
74
100
349
。。。
B是:
2
3
6
78
89
90
120
。。。
他们相同的部分是
2
3
所以我需要2边同时往下读,然后不停地track谁大。实际上我的data里面,B总是比A增
加的快,所以我写了2个for loop,对每一个A,看B里面有没有相同的,找到了就记下
位置,作为下次loop的起点。
我不是科班出身,觉得自己的算法很烂(目前发现work不错,没有问题),相信有优化
算法,故请教大家
谢谢!
附上我的code结构,注意不要笑岔气了:
ind3=1;
for ind1=1:length(A)
for ind2=ind3:length(B)
if (A==B)
blahblah
end
ind3=ind2;
end
end |
g******9 发帖数: 70 | 2 ind1 = 1
ind2 = 1
while ind1 < length(A) and ind2 < length(B)
if (A==B)
blahblah
ind1++
ind2++
else if (A < B)
ind1++
else
ind2++
end
end
【在 i***r 的大作中提到】 : 有2列随机数字(不重复),很大比如2个G,排序之后,我想找出所有共同的数字,比 : 如A开头可能是: : 1 : 2 : 3 : 7 : 10 : 74 : 100 : 349
|
x*z 发帖数: 1010 | 3 common = set(A) & set(B)
【在 i***r 的大作中提到】 : 有2列随机数字(不重复),很大比如2个G,排序之后,我想找出所有共同的数字,比 : 如A开头可能是: : 1 : 2 : 3 : 7 : 10 : 74 : 100 : 349
|
i***r 发帖数: 1035 | 4 这个好!没想到loop还可以这样写。。。。
多谢!!
【在 g******9 的大作中提到】 : ind1 = 1 : ind2 = 1 : while ind1 < length(A) and ind2 < length(B) : if (A==B) : blahblah : ind1++ : ind2++ : else if (A < B) : ind1++ : else
|
i***r 发帖数: 1035 | 5 谢谢。不过我的数据不只有数字,我还需要把同一行的其他值打出来
另外你这个common是哪个语言的function?
【在 x*z 的大作中提到】 : common = set(A) & set(B)
|
x*z 发帖数: 1010 | 6 谢包子,这个是Python里面的set,我理解你只要找出两个set里面
共同的部份,然后爱怎么处理怎么处理,这个可以省掉你排序的部
份。
【在 i***r 的大作中提到】 : 谢谢。不过我的数据不只有数字,我还需要把同一行的其他值打出来 : 另外你这个common是哪个语言的function?
|
w****w 发帖数: 521 | 7 Memory够的话,hash一下就出来了。不够的话得分批。
#!/usr/bin/env python
smallfile = file("small.txt","r")
largefile = file("large.txt","r")
outfile=file("out.txt","w")
HASHSIZE=10*1024*1024
maxvalue=0
hash={}
while 1:
line=largefile.readline()
if not line:
break
v=int(line.strip())
if v>maxvalue:
hash={}
while 1:
r=smallfile.readline()
if not r:
break
maxvalue=int(r.strip())
hash[maxvalue]=1
if len(hash)==HASHSIZE:
break
if len(hash)==0:
break
if hash.has_key(v):
outfile.write("%s\n"%(v,)) |