如何使这种数组组合算法更有效?

时间:2019-10-11 15:14:03

标签: arrays algorithm performance dynamic pseudocode

到目前为止,我有一个for循环经过a,然后是另一个for循环,该循环检查b的值,然后取c的最大值并将其放入新数组中


D = [0, 0, 0]
for i in A
    highestToAdd = 0
    for j in B
        if B[j] < A[i]
            if C[j] > highestToAdd 
                highestToAdd = C[j]
    D[i] = highestToAdd
return D
input arrays:
A = [3, 1, 7]
B = [5, 0, 2] 
C = [5, 3, 25]

output array is:
D = [25, 3, 25]

在这里您可以看到我们得到25次两次,并且必须遍历整个b一次以上,才能找到c中的最大值才能找到它。

如您所见,我将一次又一次地为a的每个值与b的每个值循环(尤其是当3个数组大小增加时),我应该朝哪个方向?

编辑-大样本

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

would result in
D = [10, 10, 5, 10, 10, 5, 10, 10, 10, 10]

2 个答案:

答案 0 :(得分:1)

您可以将B的每个元素与其在C中的匹配元素相关联,然后按值对组合的A和B进行排序。

A = [3, 1, 7]
B = [5, 0, 2]
C = [5, 3, 25]
sorted = [(0,B,3), (1,A), (2,B,25), (3,A), (5,B,5), (7,A) ]

然后,在处理此过程时,将使用C中最大的匹配元素,并在到达它们时将它们与A的元素相关联。

(0,B,3): max = 3
(1,A): A.1 is associated with 3
(2,B,25): max = 25
(3,A): A.3 is associated with 25
(5,B,5): max = 25
(7,A): A.7 is associated with 25.

最终答案:[25,3,25]

运行时间:O(n log n)

答案 1 :(得分:1)

我不确定这种逻辑,但至少可以用于样本测试。

我按照@Dave的建议将BC元素成对存储,并按C值的降序对列表进行排序。

现在,我做了类似的事情:对于每个元素(ci, bi),在A中查找所有元素,例如aj > bi。将第j个位置标记为已访问(以防止以后再分配其他ci个位置)并将ci存储在输出数组中的第j个索引处。

A = [3, 1, 7]
B = [5, 0, 2]
C = [5, 3, 25]
E = []
for i in range(len(C)):
    E.append((C[i], B[i]))

E.sort(reverse = True)

D = {}
visited = [False] * len(B)
for c, b in E:
    ind = 0
    for a in A:
        if not visited[ind] and a >= b:
            D[ind] = c
            visited[ind] = True
        ind += 1

print(D)