標籤:

演算法用在哪?

我是大學裡非常初級的程序員,主要從事 Web、.NET 和 JSP。

與人交流之後,對於演算法方面有些疑問。Web 方面基本都是對資料庫的增刪改查,群里有人說這是初級,大牛有的就去研究演算法了。

然後我就疑惑了,我們身邊對演算法的需求有多少?哪裡要用到演算法?最好能舉些例子輔助理解


謝邀!

你要身邊的例子,是吧?

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

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

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

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

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

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


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

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


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


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

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


我們來正面問題吧。

我們身邊到底對演算法的需求有多少?哪裡要用到演算法?

演算法就像空氣一樣,無時無刻不在我們身邊,我們也一刻離不開它。但是,平時真的沒人去關心它,也用不著關心。當我們需要使用演算法時,早已經有人幫助我們寫好了。

這世界上能寫增刪改查的程序員幾百萬,但能寫演算法登到
《演算法》(Algorithmica) 雜誌上的寥寥無幾。所以會寫crud只是初級的,能寫演算法的都是高級的。

社會對會寫演算法的人需求是很少的。


我可以順便舉個例子。因為恰巧就在昨天發生了。

我們設計了一個架構,大家覺得不對勁,可能存在死鎖問題,於是互相嘗試舉反例但是就是舉不出來。後來我覺得可以轉化為證明是否存在 歐拉迴路 的問題,然後就證出來不存在死鎖的。於是就不用舉反例了。

不小心就用到了演算法。

我覺得,生活中一個人懂的任何東西比別人多的任何東西,到後來,都有可能成為你比別人強的優勢。不僅僅演算法,還有很多,比如說身體好什麼的。


演算法哪都在用。

你特指的是資料庫的演算法吧?那麼好,首先,為什麼你尋找一個數據,資料庫引擎馬上就能給出來?資料庫里的數據是怎樣索引的?二叉樹?多叉樹?哈希表?

然後,如果你搜索某種數據,那麼這個庫是不是對你的搜索方式特別優化過的?

如果你需要寫,那麼資料庫是怎樣修改數據的?修改之後更新索引嗎?如果是分散式的資料庫,是怎樣保持同步的?同步是保證的嗎?

這不都是演算法么?


演算法一定是針對某個特定領域的,為了解決某一個有共性的問題而產生。你的應用複雜到一定程度,為了解決性能瓶頸或者優化現有處理過程,也會用到「演算法」。寬泛的說,你的軟體代碼裡面某一段業務邏輯也可以叫」演算法「-解決XXX的方法。軟體開發是一門系統和工程相關的科學,精通演算法的人不一定是所謂的」大牛「,只說明他數學很好。


基本上都用在了不曾留意的細節上了。

概率相關:有點意思的比如你當你在瀏覽器里輸入搜索關鍵詞時,會計算出下一個字或詞出現的概率,實現自動補全。

Google:怎麼快速搜索啦,怎麼匹配字元串啦,怎麼提升瀏覽器速度啦,涉及大量與快速需求的時候,就需要求助演算法了。

硬體:就知道一個cache oblivious演算法,讓你的磁碟更有效率的存儲和查找數據。

計算機視覺:人臉識別、圖像壓縮、角點檢測…基本上每一個ps功能都對應一個演算法了。


這有個很好的實例,reddit的best評論排序:

blog.reddit -- what"s new on reddit: reddit"s new comment sorting system

How Not To Sort By Average Rating


書到用時方恨少,演算法也一樣。


我覺得這個東西其實跟別的技術是一樣的,我們現在用不上是因為知識面不夠,眼界不夠,我們可以用演算法的時候,並不知道可以用演算法,當然覺得沒有用,等到哪天我們知識面足夠廣,演算法學的足夠多的時候,我們應該把演算法的精髓發揚光大了吧。


知乎的搜索功能


我在大學裡認為演算法是智力題,因為演算法書里解決的都是八皇后啊,漢諾塔啊啥的,抄近道兒啊啥的……相反數據結構顯得更實用。

後來工作了,聽人家說去看看stl源碼吧,然後發現,每天用到的庫裡面幾乎包含了所有學過的排序,查找啥的演算法,這些演算法又都用在紅黑樹,雙向鏈表上。


再後來聽人家說我們不用stl,效率低,庫都自己寫的,這時發現演算法好的人多牛叉!……我目光比較短淺,都是聽人家大牛說的,所以現在自己也在惡補演算法,向人家看齊!


我也沒看過多少,推薦幾本我看過的書給你吧


譚浩強的《c程序設計》


嚴蔚敏的《數據結構》


剩下的書就都是小打小鬧了(ˇ?ˇ)


演算法導論啊,計算機演算法設計與分析啊,常用演算法深入學習實錄啊,設計模式啊啥的


推薦閱讀:

如何將平面上無序的一組點連成一個簡單多邊形?
遞歸演算法的時間複雜度?
一副撲克牌,隨機洗牌後,至少有一組相鄰兩張牌數字相同的概率是多少?
如何做好「推薦演算法」?有哪些常見的錯誤需要避免?
請問隨機森林為什麼不會過度擬合?

TAG:演算法 | 編程 |