【问题标题】:Optimization of finding all pairs between two arrays查找两个数组之间的所有对的优化
【发布时间】:2020-09-13 18:28:02
【问题描述】:

问题:对于两个整数数组 A 和 B 我试图找到所有 ( i , j ) 使得 A[ i ] == B[ j ]

问题是我需要在数以百万计的整数数组上运行它。 (每个长度可能高达 100)所以,速度就是游戏的名称!我想尽我所能帮助挤奶,甚至只是一个更好的整体功能。

到目前为止,我的方法是通过以下方式对 A 和 B 进行虚拟排序:

sorted(range(len(A)), key=lambda k: A[k]) 

然后通过,提高 i 或 j(取决于哪个较低) 如果在 and A 和 B 之间找到匹配,它会扫描 A 和 B,直到找到下一个不匹配的值,并将其视为“匹配范围” 然后它将这些范围的叉积保存为找到的对。 代码在以下任一情况下终止: A 和 B 位于各自数组的末尾,或者当一个位于末尾而另一个当前指向更大的值时(因为通过扫描更远无法找到一对)

A = [3,7,8,2,1]#Example arrays. Lengths can be different.
B = [4,2,9,3,6,3]#Real arrays will be longer (up to 100).

SortA=sorted(range(len(A)), key=lambda k: A[k]) 
SortB=sorted(range(len(B)), key=lambda k: B[k]) 

solns = []
i = 0
j = 0
done = False

while(not done):
    if(A[SortA[i]] == B[SortB[j]]):

        if(i == len(A) - 1):
            endA = 0
        for m in range(len(A) - i - 1):
            endA = m + 1
            if(A[SortA[i]] != A[SortA[i + m + 1]]):
                endA = m 
                break;

        if(j == len(B) - 1):
            endB = 0
        for n in range(len(B) - j - 1):
            endB = n + 1
            if(B[SortB[j]] != B[SortB[j + n + 1]]):
                endB = n 
                break;

        for r in range(i, i + endA + 1):
            for s in range(j, j + endB + 1):
                solns.append((r,s))

        i = i + endA + 1
        j = j + endB + 1

    else:
        if(A[SortA[i]] < B[SortB[j]]):
            i = i + 1
        else:
            j = j + 1

    if(i == len(A)):
        if(j == len(B)):
            done = True
        else:
            if(A[SortA[len(A)-1]] < B[SortB[j]]):
                done = True
        i = i - 1
    if(j == len(B)):
        if(B[SortB[len(B)-1]] < A[SortA[i]]):
                done = True
        j = j - 1

上述代码中A和B的预期结果是:

Match : (2, 2) Index: (3,1)
Match : (3, 3) Index: (0,3)
Match : (3, 3) Index: (0,5)

【问题讨论】:

    标签: arrays python-3.x optimization


    【解决方案1】:

    您应该简单地使用 == 内置函数和模块,如 pandas。这是一个例子:

    import pandas as pd
    A = pd.DataFrame({'a': [0,1], 'b': [2,3]})
    B = pd.DataFrame({'a': [0,1], 'b': [2,3]})
    print( (A==B).all().all() )
    
    A = pd.DataFrame({'a': [0,-1], 'b': [2,3]})
    B = pd.DataFrame({'a': [0,1], 'b': [2,3]})
    print( (A==B).all().all() )
    

    输出:

    True
    False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多