当前位置: 首页 > news >正文

顺序表的基本操作代码_【算法与数据结构 03】数据处理的基本操作——增删查...

b99b2656b62e7864a3f0319b8e69af0a.png 点击上面“蓝字”关注我们  2c4d9fd761300e1173cd3b2d73fc6aea.png

在上一篇文章中,我们学习了 时空转换 的思想,而它的核心就是选择合适的数据结构,将时间复杂度向空间复杂度转换。那么该 如何选择合适的数据结构 呢?

要想灵活使用数据结构,你需要先弄清楚数据在代码中被处理、加工的最小单位动作,也就是数据结构的 基本操作,有了这些动作之后,你就可以基于此去选择更合适的数据结构了。

37a17b745de5c619c1ca703da051aaae.gif


1. 举个栗子:代码对数据处理

例1:查找出一个数组中,出现次数最多的那个元素的数值。例如,输入数组 a = [1,6,3,5,5,5,6 ] 中,查找出现次数最多的数值。

这个例子我们在上一篇中已经分析过。使用 字典 的数据结构能使时间复杂度降低到O(n),那究竟是什么让我们选择字典呢?下面仔细来聊一聊。

我们先看一下这个任务需要对数据进行哪些操作。我们在解这个题时,核心思路应该是:

第一步,根据原始数组计算每个元素出现的次数;

第二步,根据第一步的结果,找到出现次数最多的元素。

(1)对于上面的第一步,可以提取出的基本数据操作有:

查找:看能否在数据结构中查找到这个元素,也就是判断元素是否出现过。

新增:针对没有出现过的情况,新增这个元素。

改动:针对出现过的情况,需要对这个元素出现的次数加 1。

(2)对于上面的第二步,可以提取出的基本数据操作有:

查找:访问数据结构中的每个元素,找到次数最多的元素。

由此可见,本任务会 重复使用到查找。而能在 O(1) 的时间复杂度内完成查找动作的数据结构,只有字典类型。因此选择字典结构可能会比其他数据结构效率更高,事实也是如此。

注:此题解法可参考:【算法与数据结构 02】选择合适的数据结构——将昂贵的“时间”转换为廉价的“空间”

2. 数据处理的基本操作

设计合理的数据结构,要从问题本身出发,我们可以采用这样的思考顺序

(1) 分析这段代码到底对数据先后进行了哪些操作。

(2) 根据分析出来的数据操作,找到合理的数据结构。

这样我们就把数据处理的基本操作梳理了出来。今后,即使你遇到更复杂的问题,无非就是这些 基本操作的叠加和组合。只要按照上述的逻辑进行思考,就可以 轻松设计出合理的数据结构!

数据处理的操作就是找到需要处理的数据,计算结果,再把结果保存下来。这个过程总结为以下操作:

(1) 找到要处理的数据。这就是按照某些条件进行查找。

(2) 把结果存到一个新的内存空间中。这就是在现有数据上进行新增。

(3) 把结果存到一个已使用的内存空间中。这需要先删除内存空间中的已有数据,再新增新的数据。

3. 方法论

经过对问题的拆解,你会发现即便是很复杂的代码,它对数据的处理也只有这 3 个基本操作,增、删、查。只要围绕这 3 个数据处理的操作进行分析,就能选择出合适的方案。总结下来,我们在思考代码优化时,可以从以下三个问题入手:

(1) 这段代码对数据进行了哪些操作?

(2) 这些操作中,哪个操作最影响效率,对时间复杂度的损耗最大?

(3) 哪种数据结构最能帮助你提高数据操作的使用效率?

对于前面两个问题,围绕数据处理的基本操作,这可以通过 刷题 加深我们的理解。对于第3个问题,就需要我们去掌握相应的数据结构 基础知识,这个我在后面也会逐渐整理出来。

创作不易,点个在看再走吧 e7a1d8a28c102ad54ff3f8db5b5c6f3d.png

相关文章:

  • 利用SQL SERVER建立登录WINDOWS帐号
  • python加粗线宽代码_python-增加matplotlib中图例行的线宽
  • VSTS for Testers学习笔记目录
  • nginx 80端口转发失效_搞懂Nginx
  • python04-0.1_Python04(基础语法)
  • MSSQL 中 Stuff 的应用
  • 最大独立匹配_射频电路设计中阻抗匹配的必要性
  • SQL日期推算...
  • python强制关闭线程_在python中实现强制关闭线程的示例
  • ABAP將數字輸出前面補0
  • potplayer哪个版本最好用_市面上有多少云手机?哪个最好用?
  • ABAP两个非法修改系统程式的方法...
  • python作者 es6_Es6 写的文件import 起来解决方案详解
  • route命令详解_程序员必备的学习笔记《TCP/IP详解》IP选路、动态选路、UDP 协议...
  • 5分钟让你整明白美国金融危机爆发的原因
  • 《深入 React 技术栈》
  • 【391天】每日项目总结系列128(2018.03.03)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • GitUp, 你不可错过的秀外慧中的git工具
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JDK 6和JDK 7中的substring()方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • MaxCompute访问TableStore(OTS) 数据
  • Puppeteer:浏览器控制器
  • Python利用正则抓取网页内容保存到本地
  • Redash本地开发环境搭建
  • Redis在Web项目中的应用与实践
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 给初学者:JavaScript 中数组操作注意点
  • 技术发展面试
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 听说你叫Java(二)–Servlet请求
  • 通过npm或yarn自动生成vue组件
  • 一、python与pycharm的安装
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 正则学习笔记
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 带你开发类似Pokemon Go的AR游戏
  • (十六)串口UART
  • (译) 函数式 JS #1:简介
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .describe() python_Python-Win32com-Excel
  • .so文件(linux系统)
  • [ solr入门 ] - 利用solrJ进行检索
  • [04]Web前端进阶—JS伪数组
  • [BZOJ] 2044: 三维导弹拦截
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [CTO札记]如何测试用户接受度?
  • [git] windows系统安装git教程和配置