【发布时间】:2015-11-06 06:28:11
【问题描述】:
我正在为两个数组 A 和 B 的交集编写算法,我想要一个在空间复杂度和时间复杂度方面优化的解决方案。 我已经编写了算法,它运行良好,但我想知道是否有任何更优化的解决方案,或者是否有人可以提供给我。
我做的是:
(1) 找出两个数组中最小的。
(2) 新数组的大小分配大小等于较小大小的数组
(3) 从较小的数组中,我去比较较大数组中的每个元素,如果它存在的话,我在第三个数组“C”中得到它并在那里打破它(因为我们需要找到交点,即使它之后重复 100 次
我们不在乎我们只有一个存在足以放入第三个数组)。同时我们还必须检查较小数组中与较大数组中所有元素进行比较的元素是否已经存在于第三个数组中,例如A=[0,1,1], B[0,1,2,3]。
现在我们从 A 的第一个元素开始,它存在于数组 B 中,我们将其保存在 C[0],然后转到第二个,现在 C 是 [0,1],下一步我们再次比较 1,我们已经比较过.所以对于这种情况,我们必须检查要比较的元素是否已经存在于数组 C 中,然后我们消除对它的检查。
(4) 我们将找到的元素存储在 C(第三个数组)中并打印出来。
我的完整工作代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] aar1 = { 0, 1, 1, 7, 2, 6, 3, 9, 11, 2, 2,3,3,3,3,3,1 };
int[] aar2 = { 0, 1, 2, 3, 4, 5, 6, 11, 11, 1, 1, 1, 1 };
int[] arr3 = findIntersection(aar1, aar2);
Console.WriteLine("the array is : " + arr3);
Console.ReadKey();
}
private static int[] findIntersection(int[] aar1, int[] aar2)
{
int[] arr3 = { 0 };
if (aar1.Count() < aar2.Count())
{
int counter = 0;
arr3 = new int[aar1.Count()];
foreach (int var1 in aar1)
{
if (!checkifInThirdArray(var1, arr3))
{
foreach (int var2 in aar2)
{
if (var1 == var2)
{
arr3[counter++] = var1;
break;
}
}
}
}
}
else
{
int counter = 0;
arr3 = new int[aar1.Count()];
foreach (int var2 in aar2)
{
if (!checkifInThirdArray(var2, arr3))
{
foreach (int var1 in aar1)
{
if (var2 == var1)
{
arr3[counter++] = var2;
break;
}
}
}
}
}
return arr3;
}
private static bool checkifInThirdArray(int var1, int[] arr3)
{
bool flag = false;
if (arr3 != null)
{
foreach (int arr in arr3)
{
if (arr == var1) { flag = true; break; }
}
}
return flag;
}
}
}
我发现的一个空间复杂度问题是(如果你找到任何解决方案,我将非常感激其他问题):
(1) 当我为第三个数组分配大小时,我分配两个数组中要比较的最小值,如果交集元素太小,那么我们 不必要地分配了额外的内存。如何解决这个问题?
请注意,我不必使用任何内置函数,如 intersection() 或任何其他函数。
【问题讨论】:
-
使用使用 hashset 的 linq Intersect。您可以查看其实现并编写自己的。
-
与当前解决方案相比,它将如何改进。请写在下面作为答案详细解释,这样如果你对我有用,我什至可以标记你。
-
@struggling 它不会改进这个算法。但是,它不会使情况恶化。那么,为什么不使用单行就绪的解决方案,而不是重新发明轮子并实施自己的解决方案。
-
@struggling HashSet 是优化的集合。访问、添加和删除项目的时间复杂度为
O(1)。意味着您的收藏有多大并不重要,性能几乎相同。 Hashset 也不包含重复项。因为它使用 hashkeys 来访问它的元素。因此它不能包含重复的键,并且每个键必须是唯一的。 Intersect 使用这个哈希集来执行交集。时间复杂度为O(m+n)。 -
@M.kazemAkhgary ,我也知道它的复杂度为 O(1) 并且是最优的。但是你能给我算法(通过下面的ansering)吗?真的很有帮助
标签: c# arrays algorithm data-structures