有效地搜索一对有噪声的有序列表

时间:2016-05-09 14:43:32

标签: python algorithm search

假设两个数据集是有序的并且它们包含成对匹配,发现对的有效方法是什么?两个列表都可能有噪音。

从集合A,B集合C将由成对(A [X 1 ],B [Y 1 ])组成,(A [X 2 ],B [Y 2 ]),...,(A [X 名词],B [Y 名词 ])使得X 1 < X 2 < ......< X n 和Y 1 < Y 2 < ......< ÿ名词

问题可以通过简化的Python块来证明,其中如何验证成功对的详细信息是无关紧要的。 因为验证条件是无关的,所以条件return_pairs(A,B,validate)== return_pairs(B,A,validate)不需要保持,因为A,B中的数据不需要相同,只是必须存在(A [x],B [y])的验证函数

A = [0,0,0,1,2,0,3,4,0,5,6,0,7,0,0,8,0,0,9]
B = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,0,0,8,0,9]
B1 = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,7,7,0,0,8,0,9]

def validate(a,b):
  return a and b and a==b

def return_pairs(A,B, validation):
  ret = []    
  x,y = 0,0    
  # Do loops and index changes...
    if validation(A[x], B[y]):
        ret.append((A[x], B[y]))
  return ret

assert zip(range(1,10), range(1,10)) == return_pairs(A,B,validate)
assert zip(range(1,10), range(1,10)) == return_pairs(A,B1,validate)

2 个答案:

答案 0 :(得分:0)

不是在两个嵌套循环中迭代每个列表,而是先根据自己的标准删除噪声,然后使用过滤后的元素创建第三个列表,并根据验证运行列表中的每个项目(作为新形成的元组) 。这是假设我正确地理解了这个问题,我认为我并不是这样:

Demo

A = [0,0,0,1,2,0,3,4,0,5,6,0,7,0,0,8,0,0,9]
B = [1,2,0,0,0,0,0,3,0,0,4,0,5,6,0,0,7,0,0,8,0,9]

def clean(oldList):
    newList = []
    for item in oldList:
        if 0<item and (not newList or item>newList[-1]):
            newList.append(item)
    return newList

def validate(C):
    for item in C:
        if item[0] != item[1]:
            return False
    return True

C = zip(clean(A),clean(B))

#clean(A):[1, 2, 3, 4, 5, 6, 7, 8, 9]
#clean(B):[1, 2, 3, 4, 5, 6, 7, 8, 9]
#list(C):[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
#validate(C): True

答案 1 :(得分:-1)

解决方案。为O(n 2

def return_pairs(A,B, validation):
  ret = []

  used_x, used_y = -1,-1
  for x, _x in enumerate(A):
    for y, _y in enumerate(B):
        if x <= used_x or y <= used_y:
            continue
        if validation(A[x], B[y]):
            used_x,used_y = x,y
            ret.append((A[x], B[y]))
  return ret