Hash Map跟Set是我最喜歡的資料結構,那廢話不多說,我們就先從Set說起吧 !
Set就像一個大集合,我們經常拿它來使用在判定裡面有沒有我要找的值,他可以在O(1)的時間內就幫你找到。Set裡面不能包含有重複的值,所以即便你插入了10個1在裡面,對於這個Set還是只有一個1。再來Set是「沒有順序性」的,這樣聽起來有點玄,想一下今天我們要遍歷一個Array,他鐵定是每一次的結果都是一樣的,他會從index 0幫你遍歷到最後一格index ,即便我們新增了新的數值到後面,我們再重新遍歷後,它的順序還是不會改變。但是Set並不是這樣運作,他每次遍歷出來的結果可能都會不一樣,因此我們稱作Set為「無順序性」的資料結構。
Hash Map就像是記憶力超好的早餐店阿姨,大冰奶30元,火腿蛋餅35元,大冰奶與火腿蛋餅我們就稱作key,30元與35元我們稱作value。阿姨可以在O(1)的時間內把你購買的大冰奶映射的30元值馬上告訴你。
阿姨之所以可以那麼快知道是因為他心中已經有一塊像這樣的板子,這就是HashMap在做的事情。
所以說有時候我們要做一些映射資料的時候,HashMap就很好用,譬如我要記錄一個英文字串裡面每個字母出現的次數,我們就可以設計key是字母value是出現次數,我們在O(1)的時間內就能夠去拿到該字母出現的次數。
這邊我想大家可能會好奇為什麼我會把Hash跟Set放在一起,其實我們仔細的思考看看,HashMap跟Set都可以在O(1)時間裡去做到我們要的事情,不管是知道值有沒有存在,又或是找到他對應的Value值,而他們都是透過Hash Function來達到這個效果的,所以在理解這兩個資料結構的時候,就一起學起來也順帶做個比較吧!
依我的經驗來看,其實很多時候,要去比對兩組資料,我們不知不覺中就會用兩個Array來去做比較,但是仔細想想後會發現,其實這樣的效率並不是很高,通常時間複雜度會是O(n^2),所以時候不訪想看看在同樣的情況下,是不是用,Set或是HashMap會有較優的時間複雜度。不過在此之前也要記得,Set跟HashMap是沒有順序性的,所以考量完我們的需求之後,再判斷該使用何種資料結構是相當重要的呦。