Arrays “最小的”;";n个数组的和

Arrays “最小的”;";n个数组的和,arrays,algorithm,sum,Arrays,Algorithm,Sum,我试着做几年前我朋友的习题集,以提高我对数据结构等方面的知识。我遇到了这个问题,我真的不知道从哪里开始。希望有人能帮我 我们得到n个未排序的数组,每个数组有n个元素。前 3 1 2 7 6 9 4 9 12 现在,假设我们从每个数组中提取一个元素,并将它们相加。让我们把这些元素的和称为“n-sum” 我需要设计一个算法,给我们提供n个最小的“n-和”(允许重复) 在我们上面的例子中,答案是: 11, 12, 12 # 11 comes from: 1 (first array) + 6 (s

我试着做几年前我朋友的习题集,以提高我对数据结构等方面的知识。我遇到了这个问题,我真的不知道从哪里开始。希望有人能帮我

我们得到n个未排序的数组,每个数组有n个元素。前

3 1 2
7 6 9
4 9 12
现在,假设我们从每个数组中提取一个元素,并将它们相加。让我们把这些元素的和称为“n-sum”

我需要设计一个算法,给我们提供n个最小的“n-和”(允许重复)

在我们上面的例子中,答案是:

11, 12, 12

# 11 comes from: 1 (first array) + 6 (second array) + 4 (third array)
# 12 comes from: 2 (first array) + 6 (second array) + 4 (third array)
# 12 comes from: 1 (first array) + 7 (second array) + 4 (third array)
给出的建议之一是使用优先级队列

谢谢

时间至少为O(n^2):您必须访问所有数组元素,因为如果所有元素都等于1000,但每行中的on为0,则必须查看等于0的n个元素,否则无法找到最小和

按O(n^2个对数n)步对每行进行排序。在每行中,从行中的所有元素中减去第一个元素,因此每行中的第一个元素为0;在你找到最小的金额后,你可以补偿。你的例子变成了

3 1 2  -> 1 2 3 -> 0 1 2
7 6 9  -> 6 7 9 -> 0 1 3
4 9 12 -> 4 9 12-> 0 5 7
现在找到所有的和≤ 如果有m个和,K可以在m个步骤中完成:在第一行,依次选择所有值,只要它们是≤ K.在第二行中,只要两行的总和为≤ K等等。由于每行以0开头,因此不会浪费时间

例如,金额≤ 5个是:0+0+0、0+0+5、0+1+0、0+3+0、1+0+0、1+1+0、1+3+0、2+0+0、2+1+0、2+3+0。比我们需要的三个多得多。如果我们找到3个和后停止≤ 5.我们很快就知道“至少有3个和”≤ 5". 我们需要提前停止,因为在一般情况下可能有n^n个可能的总数

如果您选择K=“第二列中的最大元素”,则您知道至少有n+1个值的和≤ K、 因为可以从第二列中拾取所有0或除一个值之外的所有0。在您的示例中,K=5(我们知道这是有效的)。设X为有n个和的值≤ X但小于n和≤ X-1。我们用二进制搜索在0和K之间找到X,然后找到和。例如:

已知K=5足够大。我们尝试K=2,然后找到4个和(实际上我们停在3个和)。太多了我们尝试K=1,有三个解0+0+0,0+1+0和1+0+0。我们尝试K=0,但只有一种解决方案


这一部分进行得非常快,因此我们将尽量减少用于排序的时间。我们注意到,在本例中,查看前两列就足够了。我们可以在每一行中找到两个最小的项,在这种情况下就足够了。如果两个最小项不足以确定n个最小和,则在需要时找到第三小项等。例如,由于最后一行的第二大项是5,因此我们不需要该行的第三项,因为即使是5也不是K的和的元素≤ 4.

在我看来,对于这个例子,答案应该是
11,12,12
,其中最后一个总和是
1+7+4
。此外,英语只是我的第三语言,我不懂“大声重复”这个短语。你说得绝对正确。我错了,你认为这有多复杂?很容易想到暴力解决方案。但我想你想要比这更好的东西。我不太确定,我记得我的朋友必须编写代码,而且每个测试用例都有时间限制。我怀疑野蛮的强迫是正确的选择。如果我没记错的话,这是一门算法/数据结构课程。你能告诉我n的限制吗?这个问题是由在线法官决定的吗?嗯,我们有没有可能尝试使用优先级队列?我真的很想尝试使用我朋友在课程中学习到的结构。你想在优先级队列中输入什么值?有多少?你提到n=800。如果只从每行中选取最小值或次最小值,则为2^800个组合。比你能处理的还要大。如果你减去这些值,总和中的数字会改变吗?我想我不能把数字“5”记在总数里,它一开始就不存在。