Go兩個切片求差集

使用Go求兩個切片的差集

前言

剛剛參見工做,逐漸的適用了工做節奏。筆者受公司大佬們的影響,也決定開始寫博客(老闆博客)。可是,限於本人目前能力緣由,沒法寫出更有深度的博客,再接再礪。算法

場景

目前,本人從事基礎平臺研發工做,在作一款tools的時候,須要對CMDB和Prometheus兩個平臺數據比對。Meanwhile, 觸發了兩個for循環的條件反射,不到一分鐘寫出了經典for循環,結果計算了下時間複雜度M x N,將近1億次的計算,空間複雜度卻是能夠使用Builder來進行優化。由於是一款運維工具,因此重點是代碼的健壯性,對於時間,空間複雜度考慮會相對少些,可是筆者是一個「急躁」的人,這種「慢」簡直沒法忍受。In one word, 如何優化時間複雜度問題。shell

問題

當運行該工具的時候,效果是一直停頓在這個數據比對的過程當中,這怎麼能夠忍受?上網搜資料,抹油啊,怎麼辦?別慌,相信本身!數據結構

思考

  1. 兩個數據集合是切片,其中instance是struct類型。這是一種檢索的問題,hashmap?樹?
  2. 使用樹,小題大作了吧,使用hash表吧
  3. Go中map是這種數據結構
  4. 記得刷過一道題:217. 存在重複元素 雖然這個題很簡單,可是這種思路較巧妙
  5. 要是嘗試不來,我就羅盤生成文件,使用牛牛的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,可是體現了算法的美妙,以及遇到事情,要開動腦筋,將理論爲我所用! 在線上環境測試,快的一筆。。。 (要是有更好的優化方案,歡迎留言!)運維

相關文章
相關標籤/搜索