使用Go求兩個切片的差集
前言
剛剛參見工做,逐漸的適用了工做節奏。筆者受公司大佬們的影響,也決定開始寫博客(老闆博客)。可是,限於本人目前能力緣由,沒法寫出更有深度的博客,再接再礪。算法
場景
目前,本人從事基礎平臺研發工做,在作一款tools的時候,須要對CMDB和Prometheus兩個平臺數據比對。Meanwhile, 觸發了兩個for循環的條件反射,不到一分鐘寫出了經典for循環,結果計算了下時間複雜度M x N,將近1億次的計算,空間複雜度卻是能夠使用Builder來進行優化。由於是一款運維工具,因此重點是代碼的健壯性,對於時間,空間複雜度考慮會相對少些,可是筆者是一個「急躁」的人,這種「慢」簡直沒法忍受。In one word, 如何優化時間複雜度問題。shell
問題
當運行該工具的時候,效果是一直停頓在這個數據比對的過程當中,這怎麼能夠忍受?上網搜資料,抹油啊,怎麼辦?別慌,相信本身!數據結構
思考
- 兩個數據集合是切片,其中instance是struct類型。這是一種檢索的問題,hashmap?樹?
- 使用樹,小題大作了吧,使用hash表吧
- Go中map是這種數據結構
- 記得刷過一道題:217. 存在重複元素 雖然這個題很簡單,可是這種思路較巧妙
- 要是嘗試不來,我就羅盤生成文件,使用牛牛的shell sort -> 求差集 A B ->
sort A B B | uniq -u
Coding
func SubtrDemo(a []string, b []string) []string{ var c []string temp := map[string]struct{}{} // map[string]struct{}{}建立了一個key類型爲String值類型爲空struct的map,Equal -> make(map[string]struct{}) for _, val := range b{ if _, ok := temp[val]; !ok{ temp[val] = struct{}{} // 空struct 不佔內存空間 } } for _, val := range a{ if _, ok := temp[val]; !ok{ c = append(c, val) } } return c }
- 原理很簡單,慢慢體會吧。
- 不只優化了時間,在空間上使用struct{}{}進行了優化。
Testing
package subtraction import "testing" // // 求 A B 差集 -> A - B // func TestSubtraciton(t *testing.T){ //Data. Predict: ["4"] a := []string{"1","2","3","4"} b := []string{"0","1","2","3"} res := SubtrDemo(a, b) t.Log(res) }
Result
=== RUN TestSubtraciton subtraction_test.go:28: [4] --- PASS: TestSubtraciton (0.00s) PASSapp
總結
雖然這是一個小的trick,可是體現了算法的美妙,以及遇到事情,要開動腦筋,將理論爲我所用! 在線上環境測試,快的一筆。。。 (要是有更好的優化方案,歡迎留言!)運維