算法和数据结构(鉴于二者的关联,以下统称算法),对于程序员的重要性一直是个具有争议性的话题。有一些程序员内心对算法有着天然的排斥,面试当中一旦考察算法知识,会被不少程序员吐槽,但有部分公司又一直在坚持这种做法。我且以一个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. WebService-使用JDK开发WebService

    一.使用JDK开发WebService 2.1.开发WebService服务器端 1.定义一个interface,使用@WebService注解标注接口,使用@WebMethod注解标注接口中定义的所 ...

  2. [置顶] cJSON库(构建json与解析json字符串)-c语言

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

  3. 高性能MySql进化论【转】

    高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...

  4. Eclipse 将projectBuild Path中引用的jar包自己主动复制到WEB-INF下的lib目录下

    在用用 Eclipse进行Java Web开发时,web应用中引用的jar须要复制到WEB-INF下的lib目录下,否则常常出现ClassNotFound异常. 通过以下方法,能够不用手动拷贝jar包 ...

  5. Android 高仿微信头像截取 打造不一样的自定义控件

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/39761281,本文出自:[张鸿洋的博客] 1.概述 前面已经写了关于检测手势识别 ...

  6. asp.net 如何改变GridView搜索出来关键字的颜色?就像百度似的,我获得的是一个集合,改变集合中关键字的集合

    输入“产量”查询,将“产量”拆分,产.量 string strColNameCnDt = string.Empty;            for (int j = 0; j < dtTemp. ...

  7. iOS RGB颜色封装

    使用类别创建 .h文件 #import <UIKit/UIKit.h> @interface UIColor (HexColor) + (UIColor *)colorWithHex:(N ...

  8. .net 4.0 面向对象编程漫谈基础篇读书笔记

    话说笔者接触.net 已有些年头,做过的项目也有不少,有几百万的,也有几十万的,有C/S的,也有B/S的.感觉几年下来,用过的框架不少,但是.net的精髓一直没有掌握.就像学武之人懂得各种招式,但内功 ...

  9. deflate树与deflate编码

    关于deflate树,能搜到的资料非常少,这个概念来自gzip的压缩算法,是由huffman树转变过来的.这里简单记录下deflate树的生成过程以及deflate编码. 假设以5 8 9 10 14 ...

  10. javaWeb--jsp & jQuery

    jsp页面的基本构成:指令标签HTML标记语言注释   <!-- html注释 -->  <%-- java代码注释 -->   //html注释对jsp嵌入的代码不起作用,因 ...