- 论坛徽章:
- 0
|
本帖最后由 Hadron74 于 2014-12-05 10:48 编辑
这两个文件如果键值是排序好的,是一个归并排序的问题;如果没有排序好,应先排序,再归并,算法复杂度log(n)+log(m)+m+n.
用集合的运算时间复杂度太大了。
这里给出一个用Python的代码:- __author__ = 'luhongc'
- # -*- coding: utf_8 -*-
- file1 = """1221 2453
- 1223 5687
- 1243 7683
- 1245 1000
- """
- file2 ="""1221 2453
- 1223 2000
- 1245 5612
- 1265 8000
- 1287 4321
- """
- #file1 = open("file1").read() # 对外部文件的输入
- #file2 = open("file2").read()
- INfile1 = file1.strip().split('\n')
- INfile2 = file2.strip().split('\n')
- Key1 = [ [ int(i) for i in kv.split()] for kv in INfile1]
- Key2 = [ [ int(i) for i in kv.split()] for kv in INfile2]
- Key1.sort(key=lambda x: x[0]) # 队列按键排序,如果排序好文件,可以省略这步
- Key2.sort(key=lambda x: x[0])
- class DATA:
- def __init__(self,Key,KeyOther,fonly,othername):
- self.Key = Key # 本队列
- self.KeyOther = KeyOther # 另一个队列
- self.fonly = fonly # 另一个队列的输出文件句柄
- self.othername = othername # 另一个队列的名字
- self.head = 0 # 对列
- def get(self,other_header):
- try:
- t,v = self.Key[self.head]
- self.has_data = True # 是否能 得到 一个 数据
- self.t = t # 键
- self.v = v # 值
- except:
- # 如果一个 序列 为空,则把另一个序列的 值 输出到 指定 文件 中
- for key,value in self.KeyOther[other_header:]:
- self.fonly.write("%d onlyin%s %d\n" % (key,self.othername,value))
- self.has_data = False # 返回 序列为空
- self.t = "NA"
- self.v = "NA"
- return self
- def pop(self):
- self.head += 1 # 弹出本队列最小元素
- return
- with open("result1","w") as R1 , \
- open("result2","w") as R2 , \
- open("result3","w") as R3 , \
- open("result4","w") as R4 , \
- open("result5","w") as R5:
- D1 = DATA(Key1,Key2,R5,"file2")
- D2 = DATA(Key2,Key1,R4,"file1")
- D1.get(D2.head)
- D2.get(D1.head)
- while True: #归并算法,总选取两个队列中小的键进行处理
- if (D1.t > D2.t):
- R5.write("%d onlyin%s %d\n" % (D2.t,"file2",D2.v))
- D2.pop()
- D2.get(D1.head)
- if not D2.has_data:
- break
- elif (D1.t < D2.t):
- R4.write("%d onlyin%s %d\n" % (D1.t,"file1",D1.v))
- D1.pop()
- D1.get(D2.head)
- if not D1.has_data:
- break
- else:
- if ( D1.v > D2.v ):
- R2.write("%d file1biggerfile2 %d\n" % (D1.t, D1.v-D2.v))
- elif (D1.v < D2.v):
- R3.write("%d file2biggerfile1 %d\n" % (D1.t, D2.v-D1.v))
- else:
- R1.write("%d equal %d\n" % (D1.t, D1.v ) )
- D1.pop()
- D2.pop()
- D1.get(D2.head)
- if not D1.has_data:
- break
- D2.get(D1.head)
- if not D2.has_data:
- break
复制代码 |
|