我们先来看一个关于查找的例子。查找,就是从复杂的数据结构中,找到满足某个条件的元素。通常可从以下两个方面来对数据进行查找操作:​

  • 根据元素的位置或索引来查找;
  • 根据元素的数值特征来查找。

针对上述两种情况,我们分别给出例子进行详细介绍。

1. 从数组中找元素

例 1,我们来看第二个例子,对于一个数组,找到数组中的第二个元素并输出。

这个问题的处理很简单。由于数组本身具有索引 index ,因此直接通过索引就能查找到其第二个元素。别忘了,数组的索引值是从 0 开始的,因此第二个元素的索引值是 1 。不难发现,因为有了 index 的索引,所以我们就可以直接进行查找操作来,这里的时间复杂度为 O(1)

2. 从链表中找元素

例 2,我们来看第二个例子,如果是链表,如何找到这个链表中的第二个元素并输出呢?

链表和数组一样,都是 O(n) 空间复杂度的复杂数据结构。但其区别之一就是,数组有 index 的索引,而链表没有。链表是通过指针,让元素按某个自定义的顺序“手拉手”连接在一起的。

既然是这样,要查找其第二个元素,就必须要先知道第一个元素在哪里。以此类推,链表中某个位置的元素的查找,只能通过从前往后的顺序逐一去查找。不难发现,链表因为没有索引,只能“一个接一个”地按照位置条件查找,在这种情况下时间复杂度就是 O (n)

3. 查找数值

例 3,我们再来看第三个例子,关于数值条件的查找。

我们要查找出,数据结构中数值等于 5 的元素是否存在。这次的查找,无论是数组还是链表都束手无策了。唯一的方法,也只有按照顺序一个接一个地去判断元素数值是否满足等于 5 的条件。很显然,这样的查找方法时间复杂度是 O(n)。那么有没有时间复杂度更低的方式呢?答案当然是:有。

我们采用的方法是,把数组转变为字典,以保存元素及其出现次数的 k-v 映射关系。而在每次的循环中,都需要对当前遍历的元素,去查找它是否在字典中出现过。这里就是很实际的按照元素数值查找的例子。如果借助字典的数据类型,这个例子的查找问题,就可以在 O(1) 的时间复杂度内完成了。

4. 新增数据

例 4,我们再来看第四个例子,关于复杂数据结构中新增数据,这里有两个可能:

  • 第一个是在这个复杂数据结构的最后,新增一条数据;
  • 第二个是在这个复杂数据结构的中间某个位置,新增一条数据。

这两个可能性的区别在于,新增了数据之后,是否会导致原有数据结构中数据的位置顺序改变。接下来,我们分别来举例说明。

在复杂数据结构中,新增一条数据。假设是在数据结构的最后新增数据。此时新增一条数据后,对原数据没有产生任何影响。因此,执行的步骤是:​

  • 首先,通过查找操作找到数据结构中最后一个数据的位置;
  • 接着,在这个位置之后,通过新增操作,赋值或者插入一条新的数据即可;


如果是在数据结构中间的某个位置新增数据,则会对插入元素的位置之后的元素产生影响,导致数据的位置依次加 1 。例如,对于某个长度为 4 的数组,在第二个元素之后插入一个元素。则修改后的数组中,原来的第一、第二个元素的位置不发生变化,第三个元素是新插入的元素,第四、第五个元素则是原来的第三、第四个元素。

5. 删除数据

我们再来看看删除。在复杂数据结构中删除数据有两个可能:​

  • 第一个是在这个复杂数据结构的最后,删除一条数据;
  • 第二个是在这个复杂数据结构的中间某个位置,删除一条数据;

这两个可能性的区别在于,删除了数据之后,是否会导致原有数据结构中数据的位置顺序改变。由于删除操作和新增操作高度类似,就不再举详细阐述了。

6. 综合操作

例 5,在某个复杂数据结构中,在第二个元素之后新增一条数据。随后再删除第 1 个满足数值大于 6 的元素。我们来试着分析这个任务的数据操作过程。这里有两个步骤的操作:​

  • 第一步,在第二个元素之后新增一条数据。这里包含了查找和新增两个操作,即查找第二个元素的位置,并在数据结构中间新增一条数据;
  • 第二步,删除第 1 个满足数值大于 6 的元素。这里包含查找和删除两个操作,即查找出第 1 个数值大于 6 的元素的位置,并删除这个位置的元素。

因此,总共需要完成的操作包括,按照位置的查找、新增和按照数据数值的查找、删除。

7. 总结

数据处理的基本操作只有 3 个,分别是增、删、查。

  • 增和删又可以细分为在数据结构中间的增和删,以及在数据结构最后的增和删。区别就在于原数据的位置是否发生改变;
  • 查找又可以细分为按照位置条件的查找和按照数据数值特征的查找;

几乎所有的数据处理,都是这些基本操作的组合和叠加,其中涉及修改的操作可以看做是删除和新增来完成。

参考:
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=185#/detail/pc?id=3341

数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)相关推荐

  1. JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPQL进行查询

    JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技 ...

  2. 使用xom实现xml文件数据的查找,删除,修改(转载)

    说明: 1,程序需要安装第三方jar包,即xom的jar包可以在http://www.cafeconleche.org/XOM/找到相关下载链接进行下载 2,程序分为三部分,CreateMapXml. ...

  3. mysql 删除重复数据_MySQL查找和删除重复数据

    如何从MySQL中删除重复数据,只保留一条呢? 假设有如下一个数据表: mysql > SELECT * FROM users; +----+--------+ | id | name | +- ...

  4. 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。

    结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...

  5. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  6. 数据结构线性表基本操作

    数据结构线性表基本操作 基本内容 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1.顺序表的初始化 2.取值 3.查找 4.插入 5.删除 线性表的链式表示和实现 单链表的定义 ...

  7. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  8. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

    数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...

  9. 逆向查找_「函数说12」数据逆向查找很复杂?match+index让你轻松搞定

    EXCEL进阶课堂 · 函数说 持续更新,这是第12篇教程. 欢迎各位小伙伴转发.点赞.讨论,更欢迎私信获取练习素材,刻意练习才能学有收获. 第12讲:如何轻松的实现数据逆向查找--match+ind ...

最新文章

  1. linux 登录 忘记密码,redhat linux忘记登陆密码之解决办法
  2. Android root概念
  3. 共聚焦图片怎么加标尺_聚焦扶贫政策,打造小康生活
  4. C language day1
  5. Spring Boot 事务支持
  6. Google DeepMind 团队发布新算法,下一个被 AI 虐哭的是谁?
  7. Ops.CI/CD-持续交付概要笔记
  8. Atitit 项目管理之沟通管理概论问题管理 艾提拉著 跨语言沟通 群组沟通 书面沟通 目录 1. 沟通方式 2 1.1. 书面沟通 vs 当面沟通 2 1.2. 群组沟通(公开沟通) vs
  9. caxa线切割怎样画链轮_caxa线切割【图文详解】
  10. greenplum 数据库单机部署
  11. 11、C++各大有名库的介绍——综合
  12. router-view显示不出来的原因
  13. 跟小甲鱼学Web开发笔记06(最新进展不按进度顺序)
  14. 人工智能有哪些优势?人工智能5项技术介绍
  15. 通过监控Nginx日志来实时屏蔽高频恶意访问的IP
  16. emacs 中文设置与输入法安装
  17. 20个经典bootsrtap后台html网站模板推荐
  18. 如何查看CentOS7的版本信息
  19. CryEngine3教程合辑
  20. 整钱换零钱问题。把1元换成1分、2分、5分的硬币,共有多少种不同的换法(C语言)

热门文章

  1. Pyinstaller 打包 torch 后执行失败 OSError: could not get source code
  2. Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)
  3. 关于python中的dict和defaultdict
  4. Jupyter Magic - Timing(%%time %time %timeit)
  5. tensorflow 学习笔记-- tf.reduce_max、tf.sequence_mask
  6. LeetCode简单题之有多少小于当前数字的数字
  7. 前后端分离必备工具:Swagger快速搞定(整合SpringBoot详细教程)
  8. OpenArkCompiler方舟编译
  9. MinkowskiEngine实用函数和类
  10. Django 全文检索6.3