算法和数据结构(鉴于二者的关联,以下统称算法),对于程序员的重要性一直是个具有争议性的话题。有一些程序员内心对算法有着天然的排斥,面试当中一旦考察算法知识,会被不少程序员吐槽,但有部分公司又一直在坚持这种做法。我且以一个iOS程序员的视角,谈下自己粗浅的看法。

不懂算法并不妨碍成为一名iOS程序员,大家关心的是:掌握算法知识和成为一名优秀程序员之间的关系。在我看来,二者是非充分但必要的联系。至少适度的掌握算法知识是成为一名优秀程序员的必要前提,当然也包括iOS程序员。其重要性简单来说可以归为以下三点:

  • 平常编写iOS代码虽然很少遇到算法层面的考量,不过一旦遭遇特定算法问题,没有算法基础会成为无法跨越的障碍。
  • 算法有助于养成“程序员”思维,或者说“计算机”思维。这种思维方式和习惯对寻求编程问题的解决方案十分重要,让我们更加接近程序的真相。
  • 算法能锻炼脑力,养成刨根问底的习惯。

我必须承认一点,算法并不是第一次遇见就能爱上的玩意,初次接触会好奇,深入了解会头疼。我和算法的初会到建立基础的算法知识体系花了不少时间,从入门到放弃而后再入门。

平常写代码,其实会时不时的遇到算法相关的问题,只不过可能被选择性的忽视或避开了。我可以举两个简单的例子:

例一:检查通讯录的变化并上传服务器

为了检测iOS系统通讯录的变化,每次收到改变通知的时候,我们需要将Device当中的通讯录取出来和Database当中的通讯录进行对比,确认是否有新的改变,有的同学会写出如下代码:

    for (MyContact* deviceContact in deviceContacts) {
       BOOL exists = false;
       for (MyContact* dbContact in dbContacts) {
           if ([deviceContact isEqual:dbContact] == true) {
               exists = true;
           }
       }
       if (exists == false) {
           [dbContacts addObject:deviceContact];
       }
   }

假设设备有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]
   i := lo        // place for swapping
   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行代码就描述了一段精妙的思路,程序员的乐趣不就在此嘛。

iOS程序员对算法的要求的更多相关文章

  1. iOS程序员如何提升核心竞争力,防止自己被裁员?

    前言: 核心竞争力最早由普拉哈拉德和加里·哈默尔两位教授提出,通常认为核心竞争力,即企业或个人相较于竞争对手而言所具备的竞争优势与核心能力差异,说白了就是你的优势,而且最好是独一无二的的优势,这就是核 ...

  2. iOS程序员 如何提升核心竞争力,防止自己被裁员?

    前言: 核心竞争力最早由普拉哈拉德和加里·哈默尔两位教授提出,通常认为核心竞争力,即企业或个人相较于竞争对手而言所具备的竞争优势与核心能力差异, 说白了就是你的优势,而且最好是独一无二的的优势,这就是 ...

  3. iOS 程序员 6 级考试(答案和解释)

    iOS 程序员 6 级考试(答案和解释)   我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super i ...

  4. 写给iOS程序员的命令行使用秘籍

    http://www.jianshu.com/p/44d3b8f713f2 Mac OS是Unix系统的分支,有着强大的命令行功能.很多事情在命令行下处理会事半功倍,所以我就iOS程序员可能会用到的功 ...

  5. 【同行说技术】iOS程序员从小白到大神必读资料汇总

    在文章<iOS程序员从小白到大神必读资料汇总(一)>里面介绍了很多iOS入门学习的资料,今天小编就发几篇技术进阶的文章,快来看看吧! 一.iOS后台模式开发指南 这个教程会教你在什么时候怎 ...

  6. H5 App如此强悍,要降薪的恐怕已不只是iOS程序员

    2015年的最后几天,移动开发圈里最为火爆的话题之一无疑是“iOS程序员月薪降至12K”这则报道. 有人认为这是O2O创业遇冷所致,也有人认为这是iOS生态过于封闭致使智能硬件等新领域对iOS开发者的 ...

  7. 同样级别iOS程序员,为啥比我菜的程序员薪资都比我高?

    前言: 作为程序员,都有一种相同的焦虑——即当一次又一次的新技术浪潮袭来,总会不由自主的拼命跟随,总是担心如果不紧跟新技术的潮流,将会被时代所抛弃. 害怕年龄,害怕平庸,其实只是你在现实里的努力无法支 ...

  8. 作为iOS程序员,最核心的60%能力有哪些?

    作为iOS程序员,最核心的60%能力有哪些?   一个合格的iOS程序员需要掌握多少核心技能?你和专业的开发工程师的差距有多大?你现在的水平能开发一个功能完整性能高效的iOS APP吗?一起来看看下面 ...

  9. 如何成为一名成功的iOS程序员,挑战年薪50万?

    编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域.你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识.只是对编程感兴趣还不足以功成名就——众所周知,我们工作起来像疯子. 编程是一个没有极限的职业,所 ...

随机推荐

  1. Windows7 32位机上,OpenCV中配置GPU操作步骤

    1.  查看本机配置,查看显卡类型是否支持NVIDIA GPU: 2.  从http://www.nvidia.cn/Download/index.aspx?lang=cn下载最新驱动并安装: 3.  ...

  2. 基于Hadoop的大数据平台实施记——整体架构设计[转]

    http://blog.csdn.net/jacktan/article/details/9200979 大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底 ...

  3. Java MongoDB 资料集合

    一.Mongodb介绍及对比 1.NoSQL介绍及MongoDB入门 http://renial.iteye.com/blog/684829 2.mongoDB 介绍(特点.优点.原理) http:/ ...

  4. js将日期格式的时候转换成时间搓

    自己写的一个方法 function split_time(time){//将当前时间转换成时间搓  例如2013-09-11 12:12:12   var arr=time.split(" ...

  5. Linux命令vi/vim编辑

    一.vi的基本概念基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:a) 命令 ...

  6. [转载]aptitude与apt-get的区别和联系

    转自 http://www.cnblogs.com/yuxc/archive/2012/08/02/2620003.html 命令 下面将要介绍的所有命令都需要sudo!使用时请将“packagena ...

  7. css实现两端对齐~

    今天做表单时遇到让上下两个字段对齐的情况,手机号码.用户名. 然后今天在网上找了找相关方法,发现确实是没有什么好的方法解决,特别是当需要兼容的时候.找到了两个我觉得相对还不错的方法: 方法一.是在司徒 ...

  8. iocfont 网页图标字体以及使用方法

    在网页设计中使用图标字体(icon font)是件挺有新意的事情,使用图标字体能我们带来了一定的方便,比如在移动设备.Retina屏幕效果展示.兼容IE6/7浏览器以及能任意将图标放大缩小等,这些都是 ...

  9. #JavaScript对象与继承

    JavaScript对象与继承 JavaScript是我在C语言之后接触的第二门编程语言,大一暑假的时候在图书馆找了一本中国人写的JavaScript程序设计来看.那个时候在编程方面几乎还是小白,再加 ...

  10. Java中构造方法的执行顺序

    一.先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行:静态对象在构造的时候也是也先执行其内部的静态对象. 二.再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显 ...