C++以广度优先搜索的方式查找多个数组中元素的所有组合

C++ Find all combinations of elements in multiple arrays in Breadth-first search manner

本文关键字:元素 数组 组合 广度优先搜索 方式 查找 C++      更新时间:2023-10-16

我有多个数组,想找到这些数组中所有元素的排列。每个元素也有一个权重,这些数组按权重递减进行排序。我有一个有权重的数组,它模仿了数组本身的值。我希望我的搜索能找到从最大权重到最小权重的排列。

然而,数组中的每个元素都有一个与之相关的权重,所以我想先用权重最高的元素来运行搜索。

示例:

arr0 = [A, B, C, D]  
arr0_weight = [11, 7, 4, 3]  
arr1 = [W, X, Y]  
arr1_weight = [10, 9, 4]  

因此,理想的输出是:

AW (11+10=21)  
AX (11+9=20)  
BW (7+10=17)  
BX (7+9=16)  
AY (11+4=15)  
...  

如果我只是做了一个这样的for循环:

for (int i = 0; i < sizeof(arr0)/4; i++) {
  for (int j = 0; j < sizeof(arr1)/4; j++) {
    cout << arr0[i] << arr1[j] << endl; }}  

我会得到:

AW (11+10=21)   
AX (11+9=20)  
AY (11+4=15)  
BW (7+10=17)  
BX (7+9=16)  
BZ (7+4=11)  

这不是我想要的,因为17>15和16>15。

此外,对于n个数组,有什么好方法可以做到这一点?如果我不知道我会有多少个数组,而且它们的大小可能不都一样?

我已经研究过将值放入向量中,但我找不到一种方法来实现我想要的(排序的笛卡尔乘积)。有什么帮助吗?如果你没有时间,伪代码也可以——我只是真的被卡住了。

非常感谢。

您的问题是关于算法,而不是C++。

您希望在笛卡尔乘积中从最重到最轻对所有元组进行排序。

最简单的方法是找到所有元组,并根据它们的权重对它们进行排序。

如果您需要顺序访问,您应该执行以下操作。由于元组的权重是它的元素的权重之和,我认为贪婪在这里是最优的。让我们转到任意数量的任意维度的数组。创建一组索引。最初,它包含0。它所代表的第一个元组显然是最重的。找到一个要增加的索引:选择权重最小、和下一个元素差异最小的索引。不要忘记跟踪耗尽的数组。当所有的矢量都用完了,你就完了。

要在C++中实现它,应该使用vector<pair<element_t, weight_t>>作为输入数据,使用set<pair<weight_difference_t, index_t>>作为索引集。所有类型可能都是整数,但我使用自定义类型来显示应该存在哪些数据。你还应该知道如何比较这双鞋。