Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在数组中搜索求和为一个值的5个元素的算法_Arrays_Algorithm_Search_Time Complexity_Big O - Fatal编程技术网

Arrays 在数组中搜索求和为一个值的5个元素的算法

Arrays 在数组中搜索求和为一个值的5个元素的算法,arrays,algorithm,search,time-complexity,big-o,Arrays,Algorithm,Search,Time Complexity,Big O,[我最近问了一个类似的问题, 得到了精彩的答案,谢谢大家!:)] 我需要您的帮助来解决以下问题: 我正在寻找一种算法,时间复杂度必须是ϴ(n³) 该算法在未排序的数组(由n个整数组成)中搜索5个不同的整数 求和为给定的z 例如:对于输入:({2,5,7,6,3,4,9,8,21,10},22) 输出应该是true,因为我们可以求和2+7+6+3+4=22 (排序并不重要。可以先对数组进行排序,而不会影响复杂性 因此,您可以将问题看作数组已排序的问题 -没有内存限制- -我们只知道数组元素是n

[我最近问了一个类似的问题, 得到了精彩的答案,谢谢大家!:)]


我需要您的帮助来解决以下问题:
我正在寻找一种算法,时间复杂度必须是ϴ(n³)

该算法在未排序的数组(由n个整数组成)中搜索5个不同的整数
求和为给定的z

例如:对于输入:
({2,5,7,6,3,4,9,8,21,10},22)

输出应该是
true
,因为我们可以求和2+7+6+3+4=22


(排序并不重要。可以先对数组进行排序,而不会影响复杂性

因此,您可以将问题看作数组已排序的问题

-没有内存限制-

-我们只知道数组元素是n个整数-

欢迎提供任何帮助。

算法:

1) 生成由初始整数对组成的数组并对其排序。该步骤将花费O(n^2*log(n^2))时间

2) 从初始数组中选择一个值。O(n)方式

3) 现在你有一个与链接的问题非常相似的问题。您必须选择两对,使其总和等于z选择的值。谢天谢地,您已经有了一个长度为O(n^2)的已排序的所有对的数组。找到这样的对应该很简单——和你在3整数和问题中做的一样。你做了两个指针,总共移动了O(n^2)次

O(n^3)总复杂性

在查找由所选值组成的对时,您可能会遇到一些问题。跳过由您选择的值组成的每一对(当您到达这样一对时,只需进一步移动指针,就像它从未存在过一样)

假设有两对,p1和p2,求和(p1)+求和(p2)+选择值=z。如果p1和p2中的所有整数都不同,那么就有了解决方案。如果没有,那就有点乱了

让我们修复p1并检查p2之后的下一个值。它可能与p2具有相同的和,因为两个不同的对可以具有相同的和。如果是这样的话,你肯定不会与p1发生与p2相同的冲突,但是你可能会与p1的另一个整数发生冲突。如果是这样,检查p2之后的第二个值,如果它也有相同的和——它肯定不会与p1发生任何冲突

因此,假设至少有3对与p1或p2的和相同,您将始终找到一个解决方案,检查固定p1的3个值或检查固定p2的3个值

剩下的唯一可能性是,与p1具有相同总和的对少于3对,与p2具有相同总和的对少于3对。您最多可以通过4种方式选择它们——只需检查每种可能性

这有点令人不快,但在不断的操作中,您能够处理此类问题。这意味着总复杂度为O(n^3)。

算法:

1) 生成由初始整数对组成的数组并对其排序。该步骤将花费O(n^2*log(n^2))时间

2) 从初始数组中选择一个值。O(n)方式

3) 现在你有一个与链接的问题非常相似的问题。您必须选择两对,使其总和等于z选择的值。谢天谢地,您已经有了一个长度为O(n^2)的已排序的所有对的数组。找到这样的对应该很简单——和你在3整数和问题中做的一样。你做了两个指针,总共移动了O(n^2)次

O(n^3)总复杂性

在查找由所选值组成的对时,您可能会遇到一些问题。跳过由您选择的值组成的每一对(当您到达这样一对时,只需进一步移动指针,就像它从未存在过一样)

假设有两对,p1和p2,求和(p1)+求和(p2)+选择值=z。如果p1和p2中的所有整数都不同,那么就有了解决方案。如果没有,那就有点乱了

让我们修复p1并检查p2之后的下一个值。它可能与p2具有相同的和,因为两个不同的对可以具有相同的和。如果是这样的话,你肯定不会与p1发生与p2相同的冲突,但是你可能会与p1的另一个整数发生冲突。如果是这样,检查p2之后的第二个值,如果它也有相同的和——它肯定不会与p1发生任何冲突

因此,假设至少有3对与p1或p2的和相同,您将始终找到一个解决方案,检查固定p1的3个值或检查固定p2的3个值

剩下的唯一可能性是,与p1具有相同总和的对少于3对,与p2具有相同总和的对少于3对。您最多可以通过4种方式选择它们——只需检查每种可能性


这有点令人不快,但在不断的操作中,您能够处理此类问题。这意味着总的复杂度是O(n^3)。

关于“混乱的事情”——我根据总和(每对的总和,升序)对数组进行排序。它不会影响复杂度,因为它只执行一次。现在,我可以检查它是否小于、等于或大于我需要的值。现在它与另一个问题完全相同。是的,但是你仍然想要有5个不同的整数。选择具有正确总和的对并不一定能提供这一点(您可以选择两个对,它们的总和确实达到您所寻找的值,但它们可能包含相同的元素,如果我正确理解您的问题,这是错误的)对的。所以每次,如果它等于这个值,我检查所有五个元素,如果有相等的元素,我不返回true,而是继续。基本上是的。如前所述,当左指针位于对I上,右指针位于对j上时,不要只检查对I和j,还要检查对(I+1,j)、(I+2,j)、(I,j-1)、(I,j-2)、(I+1,j-1)和(I+2,j-2)。这样你就可以确保你不会