移动互联网发展到今天已经是非常成熟了,再也不是那个野蛮生长的时代。2014年前后几年,只要会写一点安卓代码,就有单位可以上岗。在移动互联网人人创业的大潮下,一大批企业应声而起。经历了十年风雨,大浪淘沙,当浪潮退去,裸泳者再也藏不住了。能后活下来的企业少之又少,android开发的岗位也少了很多。这个时候能活下来的企业就开始挑选能力更优者,价格更低者。
也就是在2019年前后,很多以前做android开发的朋友已经转行做了别的,或者换了机会更多的城市。究其原因,能做起来的公司随着用户量的增大,处理的数据日益庞大,对性能和体验的要求也越来越高。很多人不再满足公司的需求,所以只能去往小公司或者转行。这也是一个蓝海时代的结束,红海时代的到来,一切的价值回归理性。
那么数据结构与算法为什么有着重要意义呢?我们来举一些例子说明。首先我们先假设文章的读者都是一些比较有经验正程序员,一些基础的概念这里就不讲了。大家可以自行百度,自己去拓展出去。
首先,我们举一个比较简单的数据结构的例子:假如我们有一个列表界面,需要用到一个列表来存储数据,并且提供展示。那么用什么来存储比较好呢?(我们先讲大概的原因,后续的第一章会结合代码细讲)
我们一般会用ArrayList。那么为什么会用ArrayList?而不是LinkedList呢?这就要从这两种列表的数据结构讲起。ArrayList的数据存储用的是数组形式,是一个连续存储单元。而LinkedList的数据存储是用链表的形式,是一个双向链式结构非连续存储的一系列对象。所以ArrayList在末尾添加数据的时候,时间复杂度不大可记为O(N)。在获取某个数据用来展示的话,也可以通过数组的索引直接取到值。所以时间复杂度非常小,可记为O(1)。而LinkedList在添加数据的时候也是很方便的,直接创建一个新节点,并且和之前的末节点连接时间复杂度也很小,可记为O(1)。但是,列表数据更频繁是使用的功能是展示,添加数据只是在网络请求返回数据时才偶尔用到,并且两者之间在末端添加数据,时间复杂程度并没有太大差异。所以需要重点考虑的是数据的get。
ArrayList因为是数组形式存储的数据,所以可以使用数组索引,很方便的获得数据。但是LinkedList则不然,LinkedList只存储了首节点和末节点信息,其他节点都需要通过这两个节点的推导才能得到结果。所以在获取任意数据节点的复杂程度上ArrayList是O(1) LinkedList是O(n)。所以使用ArrayList作为列表展示的数据存储对象是比较优于LinkedList的。
接下来,我们举一个比较简单的算法应用的例子。比如我们现在有一个LinkedList,我们想在要查找第n个节点。一般的做法是从头开始找,一个节点一个节点的往下找。有没有更好的办法,可以减少查找的次数,加快查找进程呢?我们使用二分查找算法来试试。假设我们的LinkedList的长度是length,要查找第n个节点,我们用 half = length/2,如果n>half就从后往前找,如果n<=half我们就从前往后找。是不是我们需要查找的次数就减少了呢?在最坏的情况下,我们可以少用一半的时间。
如果在数据量比较少的情况,数据结构和算法对性能的影响并不是很大。但是在数据量非常大的时候,其他的影响就显现出来了。