排序與篩選的演算法秘密,比你想的更好用
一個老闆跟員工的賭局、一個閒著沒事的工程師,發明了改變全世界的演算法。好奇心驅動我去挖這個秘密——搞懂之後,我拿演算法來整理家裡,然後發現它可以用在任何地方。
我對秘密天生無法抗拒,如果有我不知道的,我就越想到底有什麼秘密?
演算法就其中之一,它很神秘,幾乎沒有人知道它怎麼運作,但它卻像空氣一樣無所不在——今天刷到哪篇貼文、搜尋到哪個網頁、Netflix推薦看哪部片、就連信箱裡哪封信該被丟進垃圾桶,背後都是演算法在做決定。
我以為只要夠聰明,就可以操控演算法,決定自己要看到什麼?結果還是被平台牽著鼻子走。
有一個都市傳說是:「FB的手機app會偷偷聽你在聊什麼?當你打開時,就會看到商品廣告。」被手機竊聽很可怕,但大家若無其事繼續滑IG、FB。
但我想的是另一件事——如果我搞懂了演算法是怎麼運作的,我可不可以把同一套邏輯,套用自己身上?
Google演算法排序了幾千億個網站,Gmail過濾了幾十億封垃圾信。
那我能不能用同樣的方法,排序一下我家亂七八糟的收納櫃,或是篩選一下那些「總有一天會用到」但其實一輩子不會碰的東西?
聽起來很荒謬。
但研究完之後,我覺得還真的可以。而且更有趣的是,這些演算法被發明的故事都很神奇。
更快的排序方法
1959年,25歲的Tony Hoare在莫斯科留學期間,他在做俄文翻譯成英文的專案,但當時的電腦字典是存在類似錄音帶的大型磁帶上(看下圖)。所以,他得先把句子裡的單字按照字母順序,才能去翻查磁帶字典,確認翻譯的字是什麼意思?

說實在,這件事很無聊
他想到的第一個方法(插入排序)一種類似我們整理撲克牌的方式每抽一張牌, 依照大小排入手中的牌裡面,張數不多的時候,還可以,當張數一多,就會變得太慢。
於是他想出了一個新方法-「快速排序法」。用某個字母當做基準點,直接分類成兩組。假設你有這串數字:[7, 2, 9, 4, 1, 8, 5],5就是基準點,比5大一組,比5小一組,這樣的排序方式快超多。
好巧不巧,他回英國後,加入了Elliott Computers 英國工業電腦公司,老闆叫他去寫插入排序法改良後,Shell sort的排序演算法。Tony跟老闆說,我知道更快的排序法。
老闆跟他打賭6便士他不知道,結果寫完「快速排序法」後,老闆給他6便士了。6便士其實也沒多少錢,大概可以吃幾盤麵攤的小菜而已。
最賺錢的演算法-排序
全世界最賺錢的演算法就是Larry Page和Sergey Brin發明的 PageRank排序演算法。依照網頁被連結(引用)的次數來決定搜尋的排序,被連結越多的網站排序就會越前面。
在他們發明之前,當時搜尋引擎是依照關鍵字出現在網頁裡面的次數來決定誰要排比較前面。例如:披薩店只要在網頁上面填滿「OO披薩店的夏威夷披薩最好吃」,就會變成夏威夷披薩搜尋結果第一名。(對!當時就是這麼瞎)
不過,演算法談到錢就俗氣了,我著迷於演算法的秘密,是此時此刻自己可以用在哪裡?
「排序」的本質就是讓雜亂變成有序,整齊。
居家收納就是我第一個場景,我本來整理家裡物品的方式是分類,零食櫃、醫藥櫃、日用品櫃等。一開始還好,但時間久了,自己需要花很多時間去維護分類的整齊。
「排序」這時候就可以用使用頻率來做排序,例如:每天、一週或一個月內最常使用的物品,依照使用頻率排序放再隨手可得的地方。或是依照空間使用頻率高的就放在那裏,例如:廁所內會用到的肥皂、牙膏、洗髮精、洗面乳等備品,就該直接放在廁所的收納櫃裡面。
當我研究完「排序」我幾乎不可思議的覺得收納變得好簡單喔!
對人類最有價值的演算法-篩選
1998年夏天工程師Paul,把自己的公司賣給Yahoo後,變成很有錢但沒事做的工程師(真羨慕)。
應該爽完四年後,2002年,他在用自己正在開發的新程式語言Arc寫一個網頁版信箱,他發現垃圾信氾濫的問題,開始土法煉鋼自己去猜那些字是垃圾信件會用的字,企圖開發一個篩選的演算法去過濾垃圾信件。
猜了幾個月垃圾信高頻單字後,他肚爛了,開始嘗試讓系統學習哪些字在垃圾信裡高頻出現、哪些字在正常信裡高頻出現,然後計算每封新信件屬於哪一類的機率。
例如:對於炒股仔來說交割金額,就是正常高頻出現的字。所以,每個人信箱的垃圾字都會不一樣。
幾乎現在所有電子郵件信件服務,都採用他的垃圾信件過濾篩選演算法(如果你知道現在用更好的演算法去過濾, 拜託請告訴我是什麼演算法?)。
看完他的故事,我第一個反應不是去整理信箱,而是看了一眼我家的收納櫃。
「篩選」的本質是過濾器,只留下自己要用的東西。
「排序」可以用「使用頻率」規劃擺放位置,「篩選」直接變成斷捨離的演算法了。
大部分人的斷捨離篩選的門檻條件——「一年沒碰過」——然後把每樣東西過一遍,符合就丟。但常常會把重要,但少用的東西丟掉,最後還是要買回來。
我現在的套用垃圾信過濾演算法的篩選模式是:一年沒碰的東西,問自己一個問題——什麼狀況下我會用到它?機率高或低?機率低,丟。機率高,留。
如果留下來的比丟掉的還多,不是東西太重要,是自己太會找理由。
喔對了,我差點忘了說。
這個沒事做的工程師Paul,不是普通的工程師Paul。
他就是Y Combinator的創辦人Paul Graham——投過Airbnb、Dropbox、Stripe、Reddit的那位。
幾乎所有網路鄉民,都拜讀他的文章,包括我(我是跪著拜讀)。
他把公司賣掉之後閒著沒事、隨手研究了一下垃圾信的工程師,順手改變了全世界的信箱。
我讀完這兩個演算法的故事後,突然覺得有點不好意思。
Tony整理字典、Google排序網頁、Paul過濾垃圾信,我呢?拿來整理家裡…
不過,我確實也想不出什麼厲害的演算法(謎之音:等等…搞不好哪天你可以用AI當助手寫出來??)
演算法拿來「整理收納」都能通,實際上也能擴大應用在自己各種不同層面——邏輯是一樣的,例如:任務的排序、理財的排序、個人夢想的排序。
演算法的秘密,就是先決定規則,然後照規則跑。
真正難的從來不是演算法本身,而是願不願意認真想一次:自己的規則是什麼。


