iOS 開發中都會使用哪些演算法?

培訓機構都不會只會講解前端開發的知識,很少涉及到演算法與數據結構,但是有些公司面試會面這方面的內容,請問實際開發中都會用到哪些演算法知識呢?


很少需要自己來寫演算法和數據結構,基本的演算法和數據結構都已經集成到庫中了。但需要你了解各種演算法和數據結構的不同,以便選擇適當的庫。比如各種排序、查找、字典、數組,是經常用到的。

假如連最基本的演算法和數據結構的知識都沒有,就算是寫一些界面邏輯代碼,也經常有性能問題。舉個例子,有一個很大的消息列表按照時間排序,而有新的 20 條消息來了,有些人完全無意識地,將 20 條消息一條條依次在一個大數組前面逐個插入,這樣就會引起數組的重複移動。這樣的代碼初看起來邏輯也正確,但就會很慢。

一個稍微嚴肅一點的 iOS 程序,經常用到三種語言,Swift 編寫看得見的界面,C++ 編寫看不見的底層,而 Objective-C 用於界面和底層之間的相互調用穿透。

但很多人理解的 iOS 開發,就僅僅只是界面、動畫之類的看得見的東西。在界面之下有很多看不見的更深層的東西。這些就需要演算法和數據結構知識。比如需要寫一個繪圖軟體,照相磨皮軟體,就涉及到圖形演算法。一個錄音聲音處理,就需要處理聲音的波形。一個電子書軟體就涉及到排版。一個類似 Flipboard 的內容聚合軟體就涉及網頁的抽取。

當然上述的很多演算法和數據結構不需要自己來寫,但假如完全沒有這方面的知識,就算有庫用了,但很可能連怎麼使用也不會。比如最基本的圖形學知識,矩陣都不知道,OpenGL 介面是不會用的。

---------------------------------------

題外話

做一個有點意思的軟體,可以很自豪地拿出去炫耀的。可以從兩方面著手:

  • 一個是深度,可能表現在某個演算法方面很厲害。比如文字轉聲音,聲音讀得自然。下棋軟體,AI 很厲害。搜索引擎很精確。這些軟體並非一朝一夕可以做出來,足以支撐起一家公司。

  • 一個是組織整合能力。軟體每一部分似乎沒有什麼技術含量,但是將各個部分整合起來就很不容易。比如各種社交軟體,各種平台軟體,每部分看起來都很簡單的樣子,但這種整合力並非隨便可以做到的。社交軟體是人越多價值越大,但最開始那批人是怎麼來的呢,這個第一啟動問題就不單純技術上可以解決的。

引用一段話,出自《浮生三記》:

世間成大事業者,由於才賦性格的不同,有春蠶和秋蜂兩種風格,春蠶吐絲,盡其在我,至死而無悔,其成就之大小,在其一己之才力。至於秋蜂,自己並不產蜜,卻懂得四處去采,其最後的成就,就要看他所處的環境和識別花果的才能。在藝文科學方面,成一代宗師者多是春蠶型,但在經世治國方面,工程名立者多是秋蜂型的。

我感覺現在做技術的,可能對這種整合能力有點忽視。挑選各種庫,其用所謂的業務代碼粘起來,就很不容易。沒有一定基礎的,很可能怎麼編譯也不知道。代碼不一定是要自己寫才算厲害的,只要達到目的就成了。我剛畢業第一份工作就見識過看論文寫演算法的人,似乎很厲害的樣子,但代碼寫得很爛,這樣就算裡面的演算法再厲害也基本無用。

其實呢,計算機科學是個大雜燴,很多不同種類的人都湧進來。

  • 做演算法的,傾向於科學思維。有時太過理論而難以應用。
  • 整合能力,傾向於工程思維。有時又太過埋頭搬磚,而缺乏基礎理論。

這兩批人有時是相互看不順眼的,有時又會覺得對方做的事很厲害,這很可能僅僅是相互不熟悉。不熟悉對方領域,就會處於極端而難以判斷準確,有時過於輕視,有時過於重視。


謝邀,不是iOS開發,做Android的,但是在開發當中使用的演算法差不多。

除了特別高級的,課本上的演算法、數據結構知識就沒有能原樣用得到的,變樣用得到的也基本沒有。平時使用千變萬化,不過難度不會超過快速排序、堆排序等幾個排序,頂多到哈弗曼樹的生成、迪傑克拉斯演算法的實現就足夠了,數據結構能達到二叉樹的水平就不錯了。

所以要準備和學習,我覺得到這幾個就可以了,應該沒有公司會直接考察這個吧?


演算法多用於處理數據,一般在伺服器端比較多一點.iOS最主要還是控制UI的邏輯比較多一點,所以演算法很少用.


沒用過


演算法屬於基礎知識一類,這一類,培訓機構通常都不細講,只會粗略帶過,要想深究,還是得看自己。而且演算法這一類,在iOS前端本身用得就不多,因為客戶端的就是伺服器數據的堆砌,以合適的方式展示出來。學習的話,多研究一下動畫、多線程這類深入一點的東西。這些才是真展示你能力的東西。

因為培訓機構為了順應市場,當然是什麼有用教什麼。


好奇怪為啥會有人說不需要演算法。

就那一個xml 的rss feed解析來說,很容易就能弄出一個時間複雜度 n^2 甚至 n^k 的噩夢,可是如果動點腦筋,也能寫一個複雜度為 n 的。

演算法跟數據結構那是隨時隨地都要求的啊。


兄弟們,拿起梭子,就是干就完了。哈哈哈。


學習演算法有助於對oc方法的理解,比如常見的數組,字典,字元串的操作,對象之間的各種引用,這都是數據結構的數組,鏈表,泛型的知識。這不用自己寫,但是深入一點理解對寫程序肯定有幫助。實際操作遞歸會用到。如果用到樹和圖,先找框架為好,這種問題反正不是我這種層次該考慮的。


會用到很多演算法, 但是你只要知道這個演算法存在, 不需要自己實現, 連這個演算法大致思路也不用知道. 以下是我用過的:

  1. md5
  2. base64
  3. sha1
  4. HMAC_SHA1

  5. 歸併排序, 這個是有2個已經排序好的數組, 要組成一個新數組, 我手動實現了一遍歸併排序, 但是感受不出效率
  6. 各種圖片演算法, 我直接用的GPUImage

可能我做的工作太low了把......請大神批判


國內同學對演算法的理解太狹隘了

https://en.m.wikipedia.org/wiki/Algorithm

演算法說到底就是解決問題的方法,如上解釋就是具體到每一步的操作. 而國內由於各家面試的摧殘導致大家都狹隘的覺得好像演算法就是那些把複雜度從N方降到1的排序演算法了.

如果基於演算法的定義來看,你的app中一定有很多類似的地方需要你考慮如果整理你的思路了. 說到底編程還是需要你有一個清醒的大腦和嚴密的邏輯了.


推薦閱讀:

基於五種機器演算法的信用風險評估
通俗易懂講解 直接插入排序
我可能是做了假爐石

TAG:iOS開發 | 演算法與數據結構 |