算法和数据结构(鉴于二者的关联,以下统称算法),对于程序员的重要性一直是个具有争议性的话题。有一些程序员内心对算法有着天然的排斥,面试当中一旦考察算法知识,会被不少程序员吐槽,但有部分公司又一直在坚持这种做法。我且以一个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. [置顶] cJSON库(构建json与解析json字符串)-c语言

     一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  2. [RxJS] Adding Conditional Logic with Filter

    Often you only want values to proceed through your stream if they meet certain criteria, just as if ...

  3. 初探HTML

    就在今天我抱着试一试的态度稍微看了下HTML5, 尝试着接触一点新知识, 虽然学的并不多, 但是还是异常的兴奋, 感觉有好多东西和之前的不一样了, 包括控件的创建和一些属性的设置等, 总之这些变化与改 ...

  4. html img Src base64 图片显示

    http://blog.csdn.net/knxw0001/article/details/10983605 大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: ...

  5. Visual Studio 2015 开发MVC4出现错误

    在Visual Studio 2015(以下简称VS2015)中开发MVC4项目时,编译报错"当前上下文中不存在ViewBag",一直无法编译,这个是否是VS2015的Bug? 本 ...

  6. (转)Javascript面向对象编程(二):构造函数的继承(作者:阮一峰)

    对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物& ...

  7. Js字面变量,定义问题

    Js字面变量.浏览器的版本问题:

  8. hashtable 和dictionary

    hashtable 通过 key 和value 进行访问 不是 通过 索引访问 对类型没有强制规定 ,所以类型危险 容易出错 无效的key时 会返回空 dictionary 与hashtable 相区 ...

  9. Java中书写要注意的地方

    Java的命名规则:以字母.下划线(_)或$符号开头,其后跟任意数目的字母.数字.下划线和$符号.  注意: 数字不能作为标识符的开头: 除了下划线与$符号以外,其余的符号不能使用: 不能使用关键字作 ...

  10. createjs基础

    <canvas id="gameView" width="400px" height="400px" style="back ...