求2个集合的交集

摘要:
找到两个集合的交集的第一种方法是循环两个集合并判断是否存在相同元素的最简单粗暴的方法。假设集合1的长度为M,集合2的长度为N,时间复杂度为:O(M*N)代码:publicstaticList<string>GetIntersection{List<string<list3=newList<string}();//第一个方法:循环//O(N×M)for{for{if{list3.Add;}}}}returnlist3;}第二种方法使用哈希,这是一种非常有用的数据结构。因此,我们的想法是将第一个集合的所有元素放入hashSet,时间复杂度为O;然后将第二个集合中的元素放入hashSet。如果有重复的元素,则是两个集合的交集。时间复杂度为O。

求2个集合的交集

第一种方法

最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N)

代码:

public static List<string> GetIntersection(List<string> list1, List<string> list2)
{
    List<string> list3 = new List<string>();

    //第一种方法:循环遍历
    //O(n×m)
    for (int i = 0; i < list1.Count; i++)
    {
        for (int j = 0; j < list2.Count; j++)
        {
            if (list1[i]==list2[j])
            {
                list3.Add(list1[i]);
            }
        }
    }
    return list3;
}

第二种方法

利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复元素,即hash表中的元素都是唯一的。所以,我们的思路就是:先把第一个集合的所有元素都放进hashSet中,时间复杂度O(M);再把第二个集合中的元素放进hashSet中,如果有重复元素,就是这2个集合的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。

代码:

public static List<string> GetIntersection2(List<string> list1, List<string> list2)
{
    //第二种方法:hash
    List<string> list3 = new List<string>();

    HashSet<string> hashSet = new HashSet<string>();

    foreach (string item in list1)
    {
        hashSet.Add(item);
    }

    foreach (string item in list2)
    {
        if (hashSet.Add(item) == false)
        {
            list3.Add(item);
        }
    }

    return list3;
}

测试

代码:

static void Main(string[] args)
{
    List<string> list1 = new List<string>();
    list1.Add("apple");
    list1.Add("banana");
    list1.Add("pear");
    list1.Add("orange");
    list1.Add("grape");

    List<string> list2 = new List<string>();
    list2.Add("nokia");
    list2.Add("sumsung");
    list2.Add("htc");
    list2.Add("apple");
    list2.Add("orange");

    List<string> list =new List<string>();
    //test for two set join
    //list = TwoSetsIntersection.GetIntersection(list1, list2);

    list = TwoSetsIntersection.GetIntersection2(list1, list2);                      

    foreach (string item in list)
    {
        Console.Write(item + "\t");
    }
}

总结

hash的另一个特点是查找效率为O(1),惊人的高!

对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。

求2个集合的交集第1张

  

免责声明:文章转载自《求2个集合的交集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇六种方式实现hibernate查询WebService基于SoapHeader实现安全认证下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

natapp自动获取免费的动态端口域名

前段时间,因为客户有个项目要求跨局域网进行远程控制桌面,想知道能不能实现。于是查询了许多资料,了解到需要有公网服务器作为中介才能够实现,但是公司又没有公网服务器,于是只有利用花生壳、natapp服务器实现内网穿透服务。但是这些都要收费,免费的域名和端口是随机变动的,对于测试相当不方便。于是就想设计一款工具能够自动获取natapp产生的动态域名与端口。申请n...

利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP

1、记住这个单词的意思:Interception(拦截) 2、首先说一下原理和背景   原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索。   目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代码里面不掺杂其它功能,比如:记录异常、记录操作日志。   背景:项目基本功能已完成,产品要求记录用户的操作日志,新增的时候记录某人在某时做了某事(包括...

ASP.NET Core SignalR (七):考虑设计向后兼容的SignalR API

此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。 使用自定义参数对象来确保向后兼容         向SignalR 中心 方法添加参数(要么是服务端方法,要么是客户端方法)是一个重大的变化。这就意味着老的 服务端/客户端在不带有预期个数的参数进行...

Android进入一个新页面,EditText失去焦点并禁止弹出键盘

android在进入一个新页面后,edittext会自动获取焦点并弹出软键盘,这样并不符合用户操作习惯。 在其父控件下,添加如下的属性,就可以完美解决,使其进入页面后不主动获取焦点,并且不弹出软键盘: android:focusable="true"   android:focusableInTouchMode="true" 代码如下: 1 <S...

web选择文件夹上传

我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能...

Shiro

1.shiro简介 官网介绍主要实现四个功能: Authentication: Sometimes referred to as ‘login’, this is the act of proving a user is who they say they are. Authorization: The process of access control...