假设你有以下数组:
int[] x = new int[6] {2,4,6,8,10,12};
int[] y = new int[6] {3,6,9,12,15,18};
如果你想在这个例子中打印相同的数组的值,6和12,那么在C#中执行此操作的最有效方法是什么?与字符串或布尔等其他数据类型会有区别吗?
答案 0 :(得分:2)
标记答案为O(n * m)
,当n = m时为O(n^2)
。使用其中一个数组的内容创建一个hashset,并检查另一个数组中hashset中的项是O(n + m)
,当n = m时为O(n)
。这样做需要一方面分配O(n)
额外的存储空间,另一方面,当n很大时,它将在宇宙结束之前完成。对于具有六个元素的数组,任何解决方案都可以。对于600万的阵列,明确的答案不会。这两组代码都很简单。
实施可以分两行完成。
var hashSet = new HashSet<int>(x);
var inBoth = y.Where(t => hashSet.Contains(t));
这是一个完整的程序,演示了为什么O(n^2)
解决方案对于任何实际大小的问题都不充分。如果你想说服自己两个实现都能正常运行,请将totalItems
的大小减少到~100,000,它将在合理的时间内完成。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
public class Solution
{
static void Main()
{
const int totalItems = 1000000;
var rng = new Random();
var foo = Enumerable.Range(0, totalItems).Select(x => rng.Next(1, totalItems / 2)).ToArray();
var bar = Enumerable.Range(0, totalItems).Select(x => rng.Next(1, totalItems / 2)).ToArray();
var sw = new Stopwatch();
sw.Start();
var foobar = new HashSet<int>(foo);
var inBoth = bar.Count(t => foobar.Contains(t));
sw.Stop();
Console.WriteLine(sw.Elapsed + " " + inBoth);
sw.Reset();
sw.Start();
inBoth = bar.Count(t => foo.Contains(t));
sw.Stop();
Console.WriteLine(sw.Elapsed + " " + inBoth);
Console.ReadKey();
}
}
答案 1 :(得分:0)
您可以使用以下代码查找匹配的元素
int[] x = new int[6] { 2, 4, 6, 8, 10, 12 };
int[] y = new int[6] { 3, 6, 9, 12, 15, 18 };
foreach (int i in x)
{
if (y.Contains(i))
{
Console.WriteLine(i);//Print Matched items
}
}
只要两个数组中的数据类型相同,它就可以正常工作。 希望这会对你有所帮助。