从“比较两个含有多个不同元素的集合是否相同”引申出的几种算法

简介:

在写程序的场景中有时会遇到这样的比较,假设一个集合A含有{数学,语文,英语}三个元素,集合B含有{语文,英语,数学}一样的三个元素,我们相比较A和B是否相同。单从我们直观的观察来看,这两个集合必定是相同的。但是如果通过写程序来实现却是要进行相应的算法设计的。

算法1
对集合中的元素依次进行比较。这个方法计算的时间复杂度是O(N^2),N是集合的大小。

算法2
优化一下算法,我们先将两个集合中的元素进行排序,然后顺序进行比较。这个方法计算的时间复杂度是O(NlogN),比第一个算法有了一些优化。

算法3
我们再想想,是不是可以利用高效的哈希表做些文章,我们首先把集合A中的元素都放入一张哈希表中,然后把集合B中的元素一一和哈希表中的元素作对比。这个方法计算的时间复杂度为O(N),在算法的时间复杂度上已经达到了最佳。但是要注意哈希表的存储会额外使用O(N)的空间。

算法4
想想我们在比较两个文件是否相同时会怎么做,就是提取出两个文件的信息指纹(通常是md5)。其实对于这两个集合的比较我们可以采用类似的方法。比如我们分别计算出集合A中元素A1,A2,A3的信息指纹,然后相加得到总的信息指纹FP(A),然后计算出集合B总的信息指纹FP(B),直接比较FP(A)和FP(B)即可。虽然我们的算法时间复杂度仍然为O(N),但是省去了算法3的空间复杂度O(N)。

“比较两个含有多个不同元素的集合是否相同”貌似很简单的应用却引申出了多个不同效率和实现的算法。当集合元素很少时我们采用哪种算法都不会对程序和应用产生大的影响,可是随着集合元素数量的增大却可能会对程序产生质的影响。从这几个算法迭代演进可以看出问题的解决不仅和数学思想有关,我们还应该拓宽思维意识通过类比其他问题来触类旁通

参考书籍《数学之美》

本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1362318如需转载请自行联系原作者


yaocoder

相关文章
|
1月前
|
存储 算法 测试技术
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
23 1
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
23 1
|
1月前
|
监控 算法 安全
带用集合算法set union讲解
带用集合算法set union讲解
19 0
|
3月前
|
存储 算法 Python
Python 集合探索:解密高效数据操作和快速算法的奇妙世界
Python 集合探索:解密高效数据操作和快速算法的奇妙世界
|
1月前
|
缓存 算法 安全
Java集合框架:深入探究数据结构与算法的精华
Java集合框架:深入探究数据结构与算法的精华
|
1月前
|
算法
常见算法题——203.移除链表元素
【2月更文挑战第9天】
23 0
|
1月前
|
存储 算法 Java
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
42 0
|
2月前
|
搜索推荐 算法
在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
【2月更文挑战第8天】【2月更文挑战第21篇】在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
|
2月前
|
算法
|
3月前
|
搜索推荐 算法 测试技术
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III