在寫程序的場景中有時會遇到這樣的比較,假設一個集合A含有{數學,語文,英語}三個元素,集合B含有{語文,英語,數學}同樣的三個元素,咱們相比較A和B是否相同。單從咱們直觀的觀察來看,這兩個集合一定是相同的。可是若是經過寫程序來實現倒是要進行相應的算法設計的。算法
算法1
對集合中的元素依次進行比較。這個方法計算的時間複雜度是O(N^2),N是集合的大小。ide
算法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)。排序
「比較兩個含有多個不一樣元素的集合是否相同」貌似很簡單的應用卻引伸出了多個不一樣效率和實現的算法。當集合元素不多時咱們採用哪一種算法都不會對程序和應用產生大的影響,但是隨着集合元素數量的增大卻可能會對程序產生質的影響。從這幾個算法迭代演進能夠看出問題的解決不只和數學思想有關,咱們還應該拓寬思惟意識經過類比其餘問題來舉一反三。md5
參考書籍《數學之美》get