在 C# 中的数组中记录重复信息

本文关键字:记录 信息 数组 | 更新日期: 2023-09-27 18:34:34

假设您有以下数组:

    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# 中执行此操作的最有效方法是什么?与其他数据类型(如字符串或布尔值(会有所不同吗?

在 C# 中的数组中记录重复信息

标记的答案是 O(n * m) ,当 n = m 时O(n^2)。 使用其中一个数组的内容创建一个哈希集,并检查另一个数组中的项目是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();
    }
}

您可以使用以下代码查找匹配的元素

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
    }
}

只要两个数组中的数据类型相同,它就可以正常工作。希望这对你有帮助。