【发布时间】: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