演算法用在哪?Kenneth2014-04-01 17:28:28

演算法讓一個問題變得可以透過計算來解決,好的演算法能提高解決問題的效率。

大多數程式設計師的編碼工作並不需要標新立異的演算法,但是當需要的時候,作為一個聰明人你會明白的。

演算法用在哪?程式獵人2014-04-03 09:21:49

謝邀!

你要身邊的例子,是吧?

這幾天我想做一個全自動拍攝全景照片的手機程式,目前的全景照片都需要人去點拍照按鈕,沒有能滿足需要的。但我發現我不知道怎麼把前後兩次拍下來的照片拼在一起成為全景圖……於是我感到了自己掌握演算法的不足……

前幾天我想把手機跟機器人連起來,能夠自動識別影象並作出響應,忽然發現自然世界中的影象居然是那麼的複雜。於是我瞭解到了演算法的博大精深……

後來,總算部分解決了識別技術,發現拍下來的圖不正,需要旋轉。開始後悔當年矩陣運算沒有學好,相關的影象處理演算法也沒鑽研過了……

上週末,以前參與過的一個專案,客戶反映網頁響應速度過慢。雖然沒有直接參與,但聽裡面的人說,當年開發的小弟們程式碼實在寫得太爛了,所以才會有此效能問題,稍微調整一下演算法就解決了大半問題。於是我認識到以後招人還是要出出演算法題的。

幾年前,我讓一個手下幫我寫個Excel工具,可以把有超多工作表的Excel中的工作表名字排序列出,並可以選擇跳轉。(Excel自帶的不能排序……)等我拿到之後,發現執行速度好慢啊!於是我查看了程式碼,發現丫的排序演算法居然是冒泡。果斷改為快速排序,立刻體會到了選擇正確演算法的爽快!

十幾年前,我剛參加工作,做的都是別人不屑做的體力工作。有時候會坐在那裡想:我大學學的那些演算法在實際程式設計工作中有個鳥用啊!

演算法用在哪?蕭井陌2014-10-29 00:27:45

你知道古代埃及的金字塔吧,金字塔越底層越不需要演算法

演算法用在哪?林燦斌2015-07-24 10:26:00

鬥地主的時候用來給手裡的牌排序。

懂演算法的人已經排完,不懂演算法的人還在用O(n^2)的選擇排序,在氣勢上就輸了一截,你還怎麼鬥地主?

演算法用在哪?鹽選推薦2019-08-27 11:23:29

「策略問題」只是一個通俗的說法,「演算法問題」才是一個更加恰當的說法。中學時苦苦鑽研資訊學競賽,註定將是我人生最難忘的經歷之一。在那段時間裡,我第一次聽說了「演算法」這個詞,並且有機會接觸了大量經典的演算法問題。我從中選擇了 32 個自認為最漂亮的問題,希望能讓大家體會到演算法的魅力。

1. 將一個人的眼睛蒙上,然後在他前面的桌子上擺放 52 張撲克牌,並告訴他裡面恰好有 10 張牌是正面朝上的。要求他把所有牌分成兩堆,使得這兩堆牌里正面朝上的牌的張數一樣多。他應該怎麼做?

首先把撲克牌分成兩堆,一堆 10 張,一堆 42 張。當然,那 10 張正面朝上的牌並不見得正好都在小的那一堆裡,不過很容易看出,小的那一堆裡有多少背面朝上的,大的那一堆裡就會有多少正面朝上的。因此,最後只需把小的那一堆裡的所有牌全部翻過來,目的就達成了。

2. 某種藥方要求非常嚴格,你每天需要同時服用 A、B 兩種藥片各一粒,不能多也不能少。這種藥非常貴,你不希望有任何一點的浪費。一天,你開啟裝藥片 A 的藥瓶,倒出一粒藥片放在手心;然後開啟另一個藥瓶,但不小心倒出了兩粒藥片。現在,你手心上有一粒藥片 A,兩粒藥片 B,並且你無法區別哪個是 A,哪個是 B。你如何才能嚴格遵循藥方服用藥片,並且不能有任何的浪費?

再取出一粒藥片 A,也放在手心上,因而你的手心上就有兩片 A 和兩片 B 了。把手上的每一片藥都切成兩半,分成兩堆擺放。現在,每一堆藥片恰好包含兩個半片的 A 和兩個半片的 B。一天服用其中一堆即可。

3. A、B 兩人分別在兩座島上。B 生病了,A 有 B 所需要的藥。C 有一艘小船和一個可以上鎖的箱子。C 願意在 A 和 B 之間運東西,但東西只能放在箱子裡。只要箱子沒被上鎖,C 都會偷走箱子裡的東西,不管箱子裡有什麼。如果 A 和 B 各自有一把鎖和只能開自己那把鎖的鑰匙,A 應該如何把東西安全遞交給 B?

首先 A 把藥放進箱子,用自己的鎖把箱子鎖上。B 拿到箱子後,再在箱子上加一把自己的鎖。箱子運回 A 後,A 取下自己的鎖。箱子再運到 B 手中時,B 取下自己的鎖,獲得藥物。

這是應用密碼學中一個非常有用的技巧,它可以用於很多協議問題,比方說拋硬幣問題。如果 A、B 兩人遠隔千里,他們怎樣才能採用拋擲硬幣的方法來解決爭端?當然,A 可以自己先拋擲,然後把結果告訴 B,不過前提是 B 必須要能完全相信 A 才行。如果兩人互相之間都不信任,我們還有辦法嗎?其中一種辦法是,A 先準備兩個盒子,每個盒子裡各放一張紙條,上面分別寫著「正面」和「反面」。然後,A 在兩個盒子上各加一把鎖,並把這兩個盒子都寄給 B。當 B 收到這兩個盒子後,他顯然沒法判斷出哪個盒子裝著「正面」,哪個盒子裝著「反面」,只好隨機選擇一個盒子。這個盒子裡面的字就表示拋擲硬幣的結果。B 把這個盒子回寄給 A,然後讓 A 來公佈結果。B 怎麼知道 A 是否誠實地公佈了結果呢?很簡單,B 手裡不是還有另外一個盒子嗎?B 可以向 A 索要另外一個盒子的鑰匙,然後把它開啟來,看看裡面裝的是否是另一種結果就行了。

不過,這個協議有一個巨大的漏洞:A 可以在寄盒子之前,在兩個盒子裡都裝進「正面」,然後不管 B 寄回來的是哪個盒子,都騙他說「你選中的是反面」。那怎麼辦呢?於是,剛才的遞藥方法就派上用場了。B 選完盒子以後,在這個盒子上再加一把自己的鎖,然後把盒子寄回給 A。A 收到盒子後,發現自己沒法改動盒子裡的內容,只好解開自己的鎖,把盒子再寄給 B。最後,B 開啟盒子,看到裡面寫的是什麼,從而得出硬幣拋擲的結果。B 應當把這張紙條寄給 A,讓 A 知曉硬幣拋擲的結果,並讓 A 驗證這張紙條確實是 A 當初自己寫的那張;然後,A 也應當把另一個盒子的鑰匙寄給 B,讓 B 驗證這兩個盒子裡的紙條確實是一張「正面」一張「反面」。

使用 App 檢視完整內容

目前,該付費內容的完整版僅支援在 App 中檢視

App 內檢視