免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: KoomIer
打印 上一主题 下一主题

文本计算比较 [复制链接]

论坛徽章:
5
巨蟹座
日期:2014-08-28 18:12:342015年迎新春徽章
日期:2015-03-04 10:01:4415-16赛季CBA联赛之江苏
日期:2016-04-28 09:43:3115-16赛季CBA联赛之吉林
日期:2016-06-22 10:34:4315-16赛季CBA联赛之山西
日期:2016-08-16 16:29:55
11 [报告]
发表于 2014-12-02 15:34 |只看该作者
本帖最后由 Linux_manne 于 2014-12-02 15:58 编辑

各文件 50w  测出来2.4 秒 请楼主帮忙验证 后续看看还有无优化

后续更新
  1. def fequal(c):
  2.     with open('result1','a') as f:
  3.         f.writelines(c+"\n")

  4. def fbigger(c):
  5.     with open('result2','a') as f:
  6.         f.writelines(c+"\n")

  7. def fsmaller(c):
  8.     with open('result3','a') as f:
  9.         f.writelines(c+"\n")


  10. def fonly(fname,c):
  11.     with open(fname,'a') as f:
  12.         f.writelines(c+"\n")



  13. f1 = open('file1','r')
  14. f2 = open('file2','r')

  15. d1 = dict(line.split() for line in f1)
  16. d2 = dict(line.split() for line in f2)
  17. x = set(d1.keys())
  18. y = set(d2.keys())
  19. tmp1=''
  20. tmp2=''
  21. tmp3=''
  22. tmp4=''
  23. tmp5=''
  24. for k in x-y:
  25.         tmp1 += "%s only file1 %s\n" %(k,d1[k])
  26. fonly('result4',tmp1)


  27. for k in y-x:
  28.         tmp2 += "%s only file2 %s\n" %(k,d2[k])
  29. fonly('result5',tmp2)       
  30.    

  31. for k in x&y:
  32.     if k in d2.keys():
  33.         if d1[k] == d2[k]:

  34.             tmp3 += "%s equal %s\n" %(d1[k],d2[k])
  35.         if d1[k] > d2[k]:

  36.                         tmp4 += "file1 bigger file2\n"
  37.         if d1[k] < d2[k]:

  38.                         tmp5 += "file2 bigger file1\n"

  39. fequal(tmp3)
  40. fbigger(tmp4)
  41. fsmaller(tmp5)
复制代码
1.8秒

论坛徽章:
0
12 [报告]
发表于 2014-12-02 16:47 |只看该作者
  1. #!/usr/bin/env python
  2. #
  3. #
  4. from threading import Thread

  5. class GetFileThread(Thread):
  6.     def __init__(self, setList, method):
  7.         self.setList = setList
  8.         self.method = method
  9.         super(GetFileThread, self).__init__()

  10.     def run(self):
  11.                 if self.method == "equal":
  12.                         for key in self.setList:
  13.                                 if d1[key] > d2[key]:
  14.                                         r2.write('%d file1biggerfile2 %d\n' % (key,d1[key]))
  15.                                 elif d1[key] < d2[key]:
  16.                                         r3.write('%d file2biggerfile1 %d\n' % (key,d2[key]))
  17.                                 else:
  18.                                         r1.write('%d equal %d\n' % (key,d1[key]))                               
  19.                 elif self.method == "inf1":
  20.                         for key in self.setList:
  21.                                 r4.write('%d onlyinfile1 %d\n' % (key,d1[key]))                       
  22.                 elif self.method == "inf2":
  23.                         for key in self.setList:
  24.                                 r5.write('%d onlyinfile2 %d\n' % (key,d2[key]))
  25.                                
  26. r1 = open('result1','w+')
  27. r2 = open('result2','w+')
  28. r3 = open('result3','w+')
  29. r4 = open('result4','w+')
  30. r5 = open('result5','w+')
  31.                                                
  32. d1 = dict([(int(line.split()[0]),int(line.split()[1])) for line in open('t1','r')])
  33. d2 = dict([(int(line.split()[0]),int(line.split()[1])) for line in open('t2','r')])

  34. s1 = set(d1)
  35. s2 = set(d2)

  36. threads = []
  37. t1 = GetFileThread(s1&s2,'equal')
  38. threads.append(t1)
  39. t1.start()
  40. t2 = GetFileThread(s1-s2,'inf1')
  41. threads.append(t2)
  42. t2.start()
  43. t3 = GetFileThread(s2-s1,'inf2')
  44. threads.append(t3)
  45. t3.start()
  46. for t in threads:
  47.         t.join()
  48.        
  49. r1.close()
  50. r2.close()
  51. r3.close()
  52. r4.close()
  53. r5.close()
复制代码
  加个线程,大文件时候看下是否有效果!

论坛徽章:
0
13 [报告]
发表于 2014-12-02 17:57 |只看该作者
我是来看看,学习的

论坛徽章:
0
14 [报告]
发表于 2014-12-03 16:39 |只看该作者
本帖最后由 Hadron74 于 2014-12-05 10:48 编辑

这两个文件如果键值是排序好的,是一个归并排序的问题;如果没有排序好,应先排序,再归并,算法复杂度log(n)+log(m)+m+n.
用集合的运算时间复杂度太大了。

这里给出一个用Python的代码:
  1. __author__ = 'luhongc'
  2. # -*- coding: utf_8 -*-


  3. file1 = """1221  2453
  4. 1223  5687
  5. 1243  7683
  6. 1245  1000
  7. """

  8. file2 ="""1221 2453
  9. 1223 2000
  10. 1245 5612
  11. 1265 8000
  12. 1287 4321
  13. """

  14. #file1 = open("file1").read()  # 对外部文件的输入
  15. #file2 = open("file2").read()


  16. INfile1 = file1.strip().split('\n')
  17. INfile2 = file2.strip().split('\n')

  18. Key1 = [ [ int(i) for i in kv.split()]  for kv in INfile1]
  19. Key2 = [ [ int(i) for i in kv.split()]   for kv in INfile2]

  20. Key1.sort(key=lambda x: x[0])  # 队列按键排序,如果排序好文件,可以省略这步
  21. Key2.sort(key=lambda x: x[0])

  22. class DATA:
  23.     def __init__(self,Key,KeyOther,fonly,othername):
  24.         self.Key = Key                 # 本队列
  25.         self.KeyOther = KeyOther       # 另一个队列
  26.         self.fonly = fonly             # 另一个队列的输出文件句柄
  27.         self.othername = othername     # 另一个队列的名字
  28.         self.head = 0                  # 对列

  29.     def get(self,other_header):
  30.         try:
  31.             t,v = self.Key[self.head]
  32.             self.has_data = True   # 是否能 得到 一个 数据
  33.             self.t = t             # 键
  34.             self.v = v             # 值
  35.         except:
  36.             # 如果一个 序列 为空,则把另一个序列的 值 输出到 指定 文件 中
  37.             for key,value in self.KeyOther[other_header:]:
  38.                 self.fonly.write("%d onlyin%s %d\n" % (key,self.othername,value))
  39.             self.has_data = False  # 返回 序列为空
  40.             self.t = "NA"
  41.             self.v = "NA"
  42.         return self
  43.     def pop(self):
  44.         self.head += 1            # 弹出本队列最小元素
  45.         return

  46. with open("result1","w") as R1 , \
  47.      open("result2","w") as R2 , \
  48.      open("result3","w") as R3 , \
  49.      open("result4","w") as R4 , \
  50.      open("result5","w") as R5:


  51.     D1 = DATA(Key1,Key2,R5,"file2")
  52.     D2 = DATA(Key2,Key1,R4,"file1")
  53.     D1.get(D2.head)
  54.     D2.get(D1.head)

  55.     while True:                      #归并算法,总选取两个队列中小的键进行处理
  56.         if (D1.t > D2.t):
  57.             R5.write("%d onlyin%s %d\n" % (D2.t,"file2",D2.v))
  58.             D2.pop()
  59.             D2.get(D1.head)
  60.             if not D2.has_data:
  61.                 break
  62.         elif (D1.t < D2.t):
  63.             R4.write("%d onlyin%s %d\n" % (D1.t,"file1",D1.v))
  64.             D1.pop()
  65.             D1.get(D2.head)
  66.             if not D1.has_data:
  67.                 break
  68.         else:
  69.             if ( D1.v > D2.v ):
  70.                 R2.write("%d file1biggerfile2 %d\n" % (D1.t, D1.v-D2.v))
  71.             elif (D1.v < D2.v):
  72.                 R3.write("%d file2biggerfile1 %d\n" % (D1.t, D2.v-D1.v))
  73.             else:
  74.                 R1.write("%d equal %d\n" % (D1.t, D1.v ) )
  75.             D1.pop()
  76.             D2.pop()
  77.             D1.get(D2.head)
  78.             if not D1.has_data:
  79.                 break
  80.             D2.get(D1.head)
  81.             if not D2.has_data:
  82.                 break
复制代码

论坛徽章:
0
15 [报告]
发表于 2014-12-04 17:03 |只看该作者
已开奖

回复 1# KoomIer


   

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
16 [报告]
发表于 2014-12-04 17:51 |只看该作者
回复 15# KoomIer

是说参与的都有奖吗
   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
17 [报告]
发表于 2014-12-05 09:34 |只看该作者
楼主,挺多参与者用的py3,也都很想看到结果如何,但是没有数据,你一句py3,no result,打击我们py3用户参与的积极性啊。

论坛徽章:
0
18 [报告]
发表于 2014-12-05 09:45 |只看该作者

回复 16# jcdiy0601


   

论坛徽章:
0
19 [报告]
发表于 2014-12-05 09:47 |只看该作者
这里我只能抱歉,而且我是新手,又没能力改3为2
如果有时间,你帮我改下

而且关键是算法思路

回复 17# ssfjhh


   

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
20 [报告]
发表于 2014-12-05 09:52 |只看该作者
  1. python3 balabala.py
复制代码
这样不行么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP