Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 给定3个数组,检查是否有任何公共编号_Arrays_Algorithm_Data Structures_Time Complexity - Fatal编程技术网

Arrays 给定3个数组,检查是否有任何公共编号

Arrays 给定3个数组,检查是否有任何公共编号,arrays,algorithm,data-structures,time-complexity,Arrays,Algorithm,Data Structures,Time Complexity,**我有3个数组a[1…n]b[1…n]c[1…n],它们包含整数。 没有提到数组是否已排序,或者每个数组是否有重复项。 任务是检查给定数组中是否有任何公共数字,并返回true或false。 例如:这些数组a=[3,1,5,10]b=[4,2,6,1]c=[5,3,1,7]有一个公共数字:1 我需要在^2上写一个具有时间复杂度的算法。 我让在a[]中遍历的当前元素为x,在b[]中遍历的元素为y,在c[]中遍历的元素为z,在循环中有以下情况:如果x、y和z相同,我可以简单地返回true并停止程序,

**我有3个数组a[1…n]b[1…n]c[1…n],它们包含整数。 没有提到数组是否已排序,或者每个数组是否有重复项。 任务是检查给定数组中是否有任何公共数字,并返回true或false。 例如:这些数组a=[3,1,5,10]b=[4,2,6,1]c=[5,3,1,7]有一个公共数字:1 我需要在^2上写一个具有时间复杂度的算法。 我让在a[]中遍历的当前元素为x,在b[]中遍历的元素为y,在c[]中遍历的元素为z,在循环中有以下情况:如果x、y和z相同,我可以简单地返回true并停止程序,如下所示:

 for(x=1;x<=n;x++) 
    for(y=1;y<=n;y++) 
        for(z=1;z<=n;z++)
         if(a[x]==b[y]==c[z]) 
             return true
但此算法的时间复杂度为^3,我需要^2。有什么建议吗?

建议:

合并到单个数组中,其中z=每个数组中的项之和。跟踪数组1、数组2、数组3中有多少个条目

对于每个条目,Z遍历数组以查看组合数组中有多少个重复项以及它们的位置。对于那些有2个或更多ie且有3个或更多相同数量的ie,请检查这些副本的位置是否与在不同阵列中的位置相对应,以在原始阵列中裁定我们的副本。如果数字Z有2个或多个重复项,并且它们都在不同的数组中,并通过它们在数组中的位置进行检查,则将该数字Z存储在结果数组中

报告结果数组

您将遍历整个组合数组一次,然后几乎不需要检查Z是否是其自身的副本。对于每个Z,您将再次遍历它,因此n^2复杂性。 还值得注意的是,时间复杂度现在是条目数的函数,而不是数组数的函数。嵌套循环将变为n^4,有4个数组,这将保持为n^2

在检查新Z之前,您可以通过始终检查已找到的重复项来提高效率-如果新Z已被发现为先前Z的重复项,则无需再次遍历以检查该数字。这将使它的效率更高,有更多的重复-与少数重复的次数减少遍历可能不值得额外的复杂性

当然,您也可以在不将值实际组合到单个数组中的情况下执行此操作-您只需要确保遍历例程查看数组,并以正确的顺序跟踪它找到的值

编辑

想一想,上面的方法比你想要的要多。它还可以让你报道双打、四分球等

如果你只想要三倍,那就容易多了。由于三元组需要位于所有3个数组中,因此可以首先查找2个数组中任意一个数组中的数字(如果长度不同),首先比较2个最短数组,然后对照第三个数组检查找到的任何双元组。不确定是什么降低了复杂性,但它将小于n^2…

建议:

合并到单个数组中,其中z=每个数组中的项之和。跟踪数组1、数组2、数组3中有多少个条目

对于每个条目,Z遍历数组以查看组合数组中有多少个重复项以及它们的位置。对于那些有2个或更多ie且有3个或更多相同数量的ie,请检查这些副本的位置是否与在不同阵列中的位置相对应,以在原始阵列中裁定我们的副本。如果数字Z有2个或多个重复项,并且它们都在不同的数组中,并通过它们在数组中的位置进行检查,则将该数字Z存储在结果数组中

报告结果数组

您将遍历整个组合数组一次,然后几乎不需要检查Z是否是其自身的副本。对于每个Z,您将再次遍历它,因此n^2复杂性。 还值得注意的是,时间复杂度现在是条目数的函数,而不是数组数的函数。嵌套循环将变为n^4,有4个数组,这将保持为n^2

在检查新Z之前,您可以通过始终检查已找到的重复项来提高效率-如果新Z已被发现为先前Z的重复项,则无需再次遍历以检查该数字。这将使它的效率更高,有更多的重复-与少数重复的次数减少遍历可能不值得额外的复杂性

当然,您也可以在不将值实际组合到单个数组中的情况下执行此操作-您只需要确保遍历例程查看数组,并以正确的顺序跟踪它找到的值

编辑

想一想,上面的方法比你想要的要多。它还可以让你报道双打、四分球等

如果你只想要三倍,那就容易多了。由于三元组需要在所有3个数组中,因此可以从查找开始
如果两个数组中的任何一个的长度不同,则先比较两个最短的数组,然后对照第三个数组检查找到的任何双精度数。不确定是什么降低了复杂性,但它将小于n^2…

创建一个新数组,并将公共元素保存在a和b数组中。然后使用c数组查找此数组中的公共元素

python解决方案


创建一个新数组,并将公共元素保存在a和b数组中。然后使用c数组查找此数组中的公共元素

python解决方案


有一个非常简单有效的解决方案

a类和b类。复杂性=ONlogN 对于c中的每个元素,使用二进制搜索检查它是否同时存在于a和b中。复杂性=ONlogN。
这将使您获得ONlogN的总体复杂性,比^2更高。

有一个非常简单有效的解决方案

a类和b类。复杂性=ONlogN 对于c中的每个元素,使用二进制搜索检查它是否同时存在于a和b中。复杂性=ONlogN。
这将使您的总体复杂性达到ONlogN,比^2更高。

因为我还没有看到基于集合的解决方案,所以我建议您在选择的语言中查找集合的实现方式,并执行以下操作:

set(a).intersection(b).intersection(c) != set([])

如果存在公共元素,则该值为True,否则为False。它会按时运行。

因为我还没有看到基于集合的解决方案,所以我建议寻找集合是如何用您选择的语言实现的,并执行类似的操作:

set(a).intersection(b).intersection(c) != set([])

如果存在公共元素,则该值为True,否则为False。它会准时运行。

到目前为止,所有解决方案要么需要额外的空间来创建新的数组/集合,要么更改数组排序的顺序

如果您想在O1额外空间中解决问题,并且不更改原始阵列,那么在^2时间上确实做得最好:


到目前为止,所有解决方案都需要额外的空间来创建新的数组/集合,或者更改数组排序的顺序

如果您想在O1额外空间中解决问题,并且不更改原始阵列,那么在^2时间上确实做得最好:


有很多方法可以解决这个问题,这里有几个按复杂度递减排序的方法,假设n是单个数组的平均大小:

对^3使用蛮力

它的基本原理与您测试任何三元组组合的方法相同,即使用3个嵌套的for循环来测试任何三元组组合


forx=1;x有很多方法可以解决这个问题,这里有几个按复杂度递减排序的方法,假设n是单个数组的平均大小:

对^3使用蛮力

它的基本原理与您测试任何三元组组合的方法相同,即使用3个嵌套的for循环来测试任何三元组组合


forx=1;为什么在^2上?有一个非常简单的logn解决方案。使用hashmap number->tuplebool,bool,bool,如果第i个数组中存在元素,则将tuple的第i个元素标记为true。如果hashmap中有一个元素具有所有三个true,那么元素在所有三个数组中都存在。这将给您带来时间复杂性,但您需要额外的空间。使用集合,您可以及时获取树集合的交集,如果有一个公共数字,则生成的集合是非空的。您对额外的内存使用有限制吗?否则,使用地图或字典可以在^2解决方案中解决问题,但没有一个答案为您提供^2解决方案所需的答案,因此我添加了我的答案,其中包含了从^3到On+m的更多方法,您的^2上包含了这些方法,所以请检查^2的原因?有一个非常简单的logn解决方案。使用hashmap number->tuplebool,bool,bool,如果第i个数组中存在元素,则将tuple的第i个元素标记为true。如果hashmap中有一个元素具有所有三个true,那么元素在所有三个数组中都存在。这将给您带来时间复杂性,但您需要额外的空间。使用集合,您可以及时获取树集合的交集,如果有一个公共数字,则生成的集合是非空的。您对额外的内存使用有限制吗?否则,使用地图或字典可以在OnAlready中解决此问题,但没有一个答案提供了^2解决方案所需的答案,因此我添加了我的答案,其中包含了从^3到^2的更多方法。请查看此答案。非常感谢您的帮助!但是合并到单个数组不会影响我的时间复杂度?合并到单个数组最多是一次遍历=n。你可以避免实际的组合,但这会使跟踪指针变得更具挑战性。哦,我明白了。谢谢!非常感谢你的帮助!但是合并到单个数组不会影响我的时间复杂度?合并到单个数组最多是一次遍历=n。你可以避免实际的组合,但这会使跟踪指针变得更具挑战性。哦,我明白了。谢谢!
foreach(var x in a) {                                  // n iterations
  if (b.Contains(x) && c.Contains(x)) return true;     // max. 2n
} // O(n^2)
return false;