点击上面“蓝字”关注我们 

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

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


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个问题,就需要我们去掌握相应的数据结构 基础知识,这个我在后面也会逐渐整理出来。

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

数据结构基本操作_【算法与数据结构 03】数据处理的基本操作——增删查相关推荐

  1. 队列的基本操作_算法与数据结构(五) 栈和队列

    ? 工欲善其事,必先利其器. 栈和队列 - Stack And Queue 栈 如何理解栈呢? 后进者先出,先进者后出,这就是典型的 "栈" 结构. 04_栈和队列-栈结构 从栈的 ...

  2. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

    本文将会以插入排序为例,介绍算法与数据结构的基础部分. 插入排序 排序可以说是整个算法中最为基础,最为重要的一部分,而插入排序正是排序算法中最简单的一种解决办法. 什么是排序问题? 输入:n个数的一个 ...

  3. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  4. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  5. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

    推荐一下「算法与数据结构」从入门到进阶的书单. 一.入门系列 这些书籍通过图片.打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现, ...

  6. 队列的基本操作_算法设计:数据结构-队列

    一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...

  7. js 数组 实现 完全树_算法和数据结构 | 树状数组(Binary Indexed Tree)

    本文来源于力扣圈子,作者:胡小旭.点击查看原文 力扣​leetcode-cn.com 树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为 Fenwick 树.其初 ...

  8. malloc 结构体_算法与数据结构——结构体变量

    首先,要学习数据结构,一般要先了解结构体变量的使用,那么该如何定义结构体变量呢?随我一起回忆一下吧.(不一样的音乐,不一样的体验)(1)直接定义结构体变量.struct {int a;        ...

  9. codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:

  10. 哈希表数据结构_算法与数据结构-哈希表

    前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n). 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n). ...

最新文章

  1. 如何使用IcoMoon字体图标
  2. AI视觉,视频云新挑战的解决之道
  3. svn迁移,备份,重装系统后恢复数据
  4. 【渝粤教育】国家开放大学2018年秋季 0054-22T合同法 参考试题
  5. 【树莓派学习笔记】三、点亮一个LED灯(C语言 - WiringPi、Python - RPi.GPIO/GPIO Zero、bash脚本)
  6. android 9格式吗,Android Studio中关于9-patch格式图片的编译错误
  7. Sqlite3中replace语句用法详解
  8. Displaying a Refresh Control for Table Views
  9. ORA-00923: 未找到要求的 FROM 关键字
  10. 毛子说PostgreSQL 需要实现多主
  11. PHP之tp3点击刷新验证码登录
  12. cad 切图_两种快速切图方式
  13. 计算机网络安全讲座心得,网络安全知识培训心得体会
  14. 用图形化文件对比工具kdiff3解决git rebase冲突
  15. 项目中碰见的错误(三) 对路径的访问被拒绝
  16. 几种非接触涂层测厚方法原理对比
  17. sgg-hbase-01
  18. 加多芬科技深度剖析--“什么是移动支付服务商“
  19. 高中数学40分怎么办_新高一第一次考试数学只考了40分,还有救吗?
  20. 一个HR人给应届生的面试建议【推荐】

热门文章

  1. 点击场景中的物件无法定位到Hierarchy
  2. php二维数组引用变量,PHP二维数组的引用赋值容易犯的错误
  3. 基于java的心理健康网站的设计与实现_心理评测网站设计与实现(JSP,MySQL)(含录像)...
  4. bootstrap css div布局,从css源码理解bootstrap布局容器和栅格系统
  5. cv2 python 读取像素点_OpenCV+Python车牌字符分割和识别入门
  6. mysql处理字符串函数,MySQL常用函数--字符串处理
  7. MySQL提取字符串中数字(自定义函数)
  8. The file is absent or does not have execute permission This file is needed to run this program
  9. 沪台教师携手“播种”传统文化 让中华文明浸润孩子
  10. Python3实现Win10桌面背景自动切换