場景:三個人打牌,懷疑少牌。于是清牌,兩人開始正面分類,如果某種花色少
于四張則此花色少牌。我則提議數總數,少于五十四張就少牌了。
出于專業的關系,立馬聯想到這是個算法問題。判定是否少牌比少哪張牌需要的信息量少得多。
算法一:判定少哪張牌
kind = new dict(0) #每種花色張數初始值為0
for c in cards:
kind[c] += 1
for k,v in kind:
if v < 4:
print(k+"缺"+(4 - v)+"張")
時間復雜度為O(n),空間復雜的為O(n)。
算法二:是否少牌
sum(cards)< 54
如果cards從文件中讀取,時間復雜度為O(n),空間復雜度為O(1)。
還有個最重要的差距是并行化的難易程度,因為我們有三個人,相當于三顆CPU。
算法一有一個共有數據kind字典,因此同步數據時,有鎖的問題。想要實現
lock-free,就要各自保存一份kind字典,最后歸總,空間復雜度和時間復雜度
與n成正比。相比之下算法二,天生lock-free很容易實現并行,并不會帶來多余
的復雜度。
提到這個問題是想說明,問題定義清晰能減少很多無用功。當然在這里體現不明
顯,純屬閑的。