演算法和資料結構(鑑於二者的關聯,以下統稱演算法),對於程式設計師的重要性一直是個具有爭議性的話題。有一些程式設計師內心對演算法有著天然的排斥,面試當中一旦考察演算法知識,會被不少程式設計師吐槽,但有部分公司又一直在堅持這種做法。我且以乙個ios程式設計師的視角,談下自己粗淺的看法。
不懂演算法並不妨礙成為一名ios程式設計師,大家關心的是:掌握演算法知識和成為一名優秀程式設計師之間的關係。在我看來,二者是非充分但必要的聯絡。至少適度的掌握演算法知識是成為一名優秀程式設計師的必要前提,當然也包括ios程式設計師。其重要性簡單來說可以歸為以下三點:
我必須承認一點,演算法並不是第一次遇見就能愛上的玩意,初次接觸會好奇,深入了解會頭疼。我和演算法的初會到建立基礎的演算法知識體系花了不少時間,從入門到放棄而後再入門。
例一:檢查通訊錄的變化並上傳伺服器
為了檢測ios系統通訊錄的變化,每次收到改變通知的時候,我們需要將device當中的通訊錄取出來和database當中的通訊錄進行對比,確認是否有新的改變,有的同學會寫出如下**:
for (mycontact* devicecontact in devicecontacts)
}if (exists == false)
}
假設裝置有1000+通訊錄記錄(並不少見),這兩層的for就是1,000,000次迴圈,不經意間就埋了個效能問題的坑,如果了解如何計算時間複雜度,知道hash表,針對這種場景就能寫出更優質的**。無序集合,有序集合,雜湊表查詢元素的問題是演算法當中基礎的基礎。雜湊表查詢元素的時間複雜度是我面試常問的問題。
例二:資料庫建表時索引的用處
有些程式設計師沒聽過索引是什麼,有些從前輩那裡得知索引可以加快查詢但對原理卻不甚了解,掌握這些常用技巧背後的理論知識才能做到合理使用,比如為什麼我們不對錶的每乙個field都建立索引呢?理解索引是通過「新建表」配合「b+樹」來實現快速查詢的,就能很好明白索引這項利器的優和劣。索引也是我面試時的必問問題之一。
演算法同時還是個鍛鍊腦力的好方式,我之前的文章中介紹個乙個小tip可以保持每天腦力充沛:早上在進入工作狀態之前解決乙個小問題。演算法問題是個不錯的選擇,演算法都比較獨立而且針對性強。比如排序演算法當中的quicksort演算法,空閒的時候把思路重理一遍,甚至用**敲出來,就像每天晚上做俯臥撐一樣,對大腦的鍛鍊十分有效,下面一小段偽**摘自wikipedia的quicksort介紹:
algorithm quicksort(a, lo, hi) is
if lo < hi then
p := partition(a, lo, hi)
quicksort(a, lo, p – 1)
quicksort(a, p + 1, hi)
algorithm partition(a, lo, hi) is
pivot := a[hi]
for j := lo to hi – 1 do
if a[j] ≤ pivot then
swap a[i] with a[j]
i := i + 1
swap a[i] with a[hi]
return i
雖然一共只有14行,你能一目了然的看清解決思路嗎?尤其是partition函式,短短7行**就描述了一段精妙的思路,程式設計師的樂趣不就在此嘛。 PHP對程式設計師的要求更高
首先,大家都知道,php也是一種編譯型指令碼語言,和其他的預編譯型語言不同,它不是編譯成中間 然後發布.而是每次執行都需要編譯.為此,也就有了一些opcode cache,比如開源的apc,eacc.還有商業的zend o 等.那麼為什麼php不把編譯 執行分開呢?php雖然是一種編譯型指令碼語言,...
高階程式設計師的要求
1 腦力勞動的人,我用的是大腦。如果是用搬運工,我去鄉下能招更便宜的 2 樓主 8年工作了,搞的 開發,介面庫 別人的,框架 別人的。資料庫 別人的。那麼,樓主你自己的東西呢?如果只是組合別人的東西,也就是個體力勞動。3 第二條你可能聽不懂,我換個方式說。你會用筷子,我也會,我還能左右手呢,有意義嗎...
VB 程式設計師 不要放鬆對自己的要求
業界一直對 vb 程式設計師有偏見,認為這個群體普遍水平不高。最近在維護 修改 vb.net 的老 時發現,這是有原因的。以 vb.net 為例,注意兩個選項 option explicit 和 option strict 前者表示,每個變數要先宣告才能使用。後者,則對隱式型別轉換有一定的要求。另外...