時尚中心/綜合報導
如果我們想在一列物品裡找尋某一品項,就勢必要翻遍所有項目,才能找到目標物品嗎?假設你在百貨公司買衣服,一整排的衣服要挑出你的尺寸,除了一件一件翻,還有什麼更聰明的方法嗎?快看下去就知道囉!
▲要怎麼樣從一大堆衣服中快速找到自己的尺寸呢?(圖/翻攝自wheredoesitcomefrom)
這天是聖誕節翌日。在蘇格蘭因弗內斯(Inverness)從事護理工作的艾培˙湯亞姆早已跟著大批人群駐守在百貨公司外,摩拳擦掌準備迎接今年的節禮日(Boxing Day)折扣。
艾培穿的衣服尺寸是大眾尺碼,因此她誠心祈禱自己是第一個走進店裡的客人,如此才有機會買到尺寸剛好的衣服。她的手腳得夠快才行。
▲想百貨公司周年慶搶到想要的衣服是個挑戰。(圖/翻攝自WAER)
這樣的激戰場面往往會失控,像去年就有十五個人因為推擠而受傷,最後甚至還出動了鎮暴警察才稍稍平息混亂。艾培究竟該怎麼做,才能比別人搶先一步拿到自己想要的衣服尺寸呢?
建議:試著將這一情境誇張想像。如果這間商店的衣杆長度,簡直像貫穿了店頭店尾那般一望無際,那該怎麼辦呢?
▲人多衣服也多要迅速找出來一定不能瞎找。(圖/商周出版社提供)
如果我們想在一列物品裡找尋某一品項,就勢必要翻遍所有項目,才能找到目標物品嗎?換句話說,假設眼前有一百件物品,我們就得瀏覽完那一百件物品,也就是要採取執行效率為線性時間(linear time)的查找方式嗎?
一般而言,線性函數是指,若我們在一百件物品裡找尋某一物品需花費一分鐘,那麼依此推測,在兩百件物品裡找尋某樣物品,就要耗費兩分鐘。
照常理而論,的確如此,但集合資料(collection)也具有某種特殊性,亦即被排序的特性,因而可使我們在執行效率為對數(logarithmic)時間內找到某一資料。換言之,找尋步驟大約為七次,而不再是一百次。
▲利用集合資料的排序特性,再搭配演算法就能大幅縮短找衣服的時間。(圖/翻攝自Shutterstock,以下同)
讓我們先想像故事的女主角艾培,踏進店內那一刻的模樣吧!她的臉上閃耀著光輝,垂掛在肩膀上的蘇格蘭紋披巾隨風飄揚,彷彿在身後捲起一朵朵浪花。
她發自心底湧出的戰吼聲,化作一顆顆子彈從齒縫間呼嘯而出,掃射整家店的牆面,背水一戰取得的戰果,足以留供後代子孫景仰憑弔。她整個早晨無時無刻都在對自己信心喊話!
▲大家不妨換位思考,換做自己會如何找衣服呢?
目標:在特定的一排衣架上,找到尺寸剛好的衣服。
方法一:從衣架的一端開始翻找到另一端。
方法二:先從衣架接近中間位置的某處開始找起。若掛在中間區段的衣服為較大尺寸,就改往左邊尋找。反之若為較小尺寸,則移往右邊尋找。依此類推。
兩種方法的比較結果,如下圖所示。你注意到了嗎?當衣架上的衣服數量增加時,方法一的速度顯然比方法二慢。
你或許猜到了,方法二運用了兩道解題認知。第一,衣架上的衣服通常會依照尺寸排列。其次,由於艾培要找的是大眾尺碼,亦即平均尺碼,所以通常會被擺放在衣架的中央區塊。
▲衣架上的衣服數量增加時,方法二的速度更勝一籌。(圖/商周出版社提供,以下同)
利用這一直覺能力不僅使她選擇從中間位置開始找起,隨後也能往左或往右跳躍尋找,是以每次都使那一列集合物件的搜尋數量縮減一半,而這正是執行效率為對數時間(logarithmic-time)之演算法的鮮明特徵。
你可以運用相同的直覺力在一本字典裡查找某個單字,或在電話簿裡找尋某個人的名字,或在書籍的索引中搜尋某一主題,又或者是在閱讀一本冗長小說的過程中不小心墜入夢鄉,隔天想要找回停頓的段落。
簡單來說,我們可將這種方法形容為某種訊息拋棄。
▲這種方法不只可以用在找衣服,日常生活中都可以運用。
我們在「對數」概念裡最能切身感受到的一點,就是它的增長速度緩慢,誠如先前的比較圖所示。人們都偏好增長速度緩慢的解決問題方式,因為這代表這一方法不會那麼容易受到眼前處理事物的數量變化而有所影響。
在我們的情境裡,艾培在一排掛滿一百件衣服的衣架上,只需經過七次以內的步驟就能找到尺寸剛好的衣服,又假設是在一排掛有一千件衣服的衣架上,也只要花費約十次的找尋過程,說起來也不算太麻煩。
這一在有序的集合資料裡,以執行效率為對數時間成長展開搜尋的方法又稱作二分搜尋法(binary search)。二分搜尋法會比另外一種稱作線性搜尋(linear search)的方法(方法一)更有效率,且想必能讓艾培在這次折扣活動裡滿載而歸。
▲下次要從很多東西裡找出一樣時,不妨也用看看二分搜尋法吧。
【書籍推薦】
★書名:做決定不要靠運氣:從出門購物到分類郵件,用演算法找出人生最佳解
★作者: 阿里.艾默沙維
★出版社:商周出版社
★出版日期:2017年10月14日
★建議售價:新台幣270元
我想要說....