从“比较两个含有多个不同元素的集合是否相同”引申出的几种算法
2014-02-23 11:32
441 查看
在写程序的场景中有时会遇到这样的比较,假设一个集合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)。
“比较两个含有多个不同元素的集合是否相同”貌似很简单的应用却引申出了多个不同效率和实现的算法。当集合元素很少时我们采用哪种算法都不会对程序和应用产生大的影响,可是随着集合元素数量的增大却可能会对程序产生质的影响。从这几个算法迭代演进可以看出问题的解决不仅和数学思想有关,我们还应该拓宽思维意识通过类比其他问题来触类旁通。
参考书籍《数学之美》
算法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)。
“比较两个含有多个不同元素的集合是否相同”貌似很简单的应用却引申出了多个不同效率和实现的算法。当集合元素很少时我们采用哪种算法都不会对程序和应用产生大的影响,可是随着集合元素数量的增大却可能会对程序产生质的影响。从这几个算法迭代演进可以看出问题的解决不仅和数学思想有关,我们还应该拓宽思维意识通过类比其他问题来触类旁通。
参考书籍《数学之美》
相关文章推荐
- 从“比较两个含有多个不同元素的集合是否相同”引申出的几种算法
- 比较两个List元素是否相同,查找出两个list的不同元素
- js中比较两个数组中是否含有相同的元素,可去重,可删除合并为新数组
- js中比较两个数组中是否含有相同的元素,可去重,可删除合并为新数组
- iOS小问题--使用NSPredicate比较两个数组中相同(不同)的元素
- php 比较获取两个数组相同和不同元素(交集和差集)
- 【算法】找出两个已序数组,是否含有相同的数字
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 【C语言】比较两个数组中是否有相同的元素
- 比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- JAVA两个数组间元素的比较(找出相同或者不同元素)
- 比较两个List是否相等(相同元素)
- 比较两个等长字符串是否含有完全相同字符(忽略字符顺序)
- 不同集合含有相同元素时不能使用链表
- 题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
- java Android 判断两个集合是否包含不同元素
- C# 比较两个数组中的内容是否相同的算法
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和