序言-为什么要学数据结构与算法

本文探讨了在移动互联网成熟期,数据结构与算法的重要性。通过列举ArrayList和LinkedList的选择,展示了如何根据数据访问频率优化列表操作。并以查找LinkedList中节点为例,说明算法效率在大数据场景下的提升。阐述了在海量数据下,性能和体验选择的理性回归。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    移动互联网发展到今天已经是非常成熟了,再也不是那个野蛮生长的时代。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我们就从前往后找。是不是我们需要查找的次数就减少了呢?在最坏的情况下,我们可以少用一半的时间。

    如果在数据量比较少的情况,数据结构和算法对性能的影响并不是很大。但是在数据量非常大的时候,其他的影响就显现出来了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闽农qq:994955138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值