在寫程序的場景中有時會遇到這樣的比較,假設一個集合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)。
“比較兩個含有多個不同元素的集合是否相同”貌似很簡單的應用卻引申出了多個不同效率和實現的算法。當集合元素很少時我們採用哪種算法都不會對程序和應用產生大的影響,可是隨着集合元素數量的增大卻可能會對程序產生質的影響。從這幾個算法迭代演進可以看出問題的解決不僅和數學思想有關,我們還應該拓寬思維意識通過類比其他問題來觸類旁通。
參考書籍《數學之美》