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