数组低效的“插入”和“删除”

这篇具有很好参考价值的文章主要介绍了数组低效的“插入”和“删除”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插入操作

假设数组的长度为 n,现在,如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来,给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一位。那插入操作的时间复杂度是多少呢?

如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为 O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是 O(n)。 因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为 (1+2+...n)/n=O(n)。

如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移 k 之后的数据。但是,如果数组中存储的数据并没有任何规律,数组只是被当作一个存储数据的集合。在这种情况下,如果要将某个数据插入到第 k 个位置,为了避免大规模的数据搬移,我们还有一个简单的办法就是,直接将第 k 位的数据搬移到数组元素的最后,把新的元素直接放入第 k 个位置。

为了更好地理解,我们举一个例子。假设数组 a[10]中存储了如下 5 个元素:a,b,c,d,e。我们现在需要将元素 x 插入到第 3 个位置。我们只需要将 c 放入到 a[5],将 a[2]赋值为 x 即可。最后,数组中的元素如下: a,b,x,d,e,c。

数组低效的“插入”和“删除”

利用这种处理技巧,在特定场景下,在第 k 个位置插入一个元素的时间复杂度就会降为 O(1)

删除操作

跟插入数据类似,如果我们要删除第 k 个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。

和插入类似,如果删除数组末尾的数据,则最好情况时间复杂度为 O(1);如果删除开头的数据,则最坏情况时间复杂度为 O(n);平均情况时间复杂度也为 O(n)。

实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率是不是会提高很多呢?我们继续来看例子。数组 a[10]中存储了 8 个元素:a,b,c,d,e,f,g,h。现在,我们要依次删除 a,b,c 三个元素

数组低效的“插入”和“删除”

为了避免 d,e,f,g,h 这几个数据会被搬移三次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

如果你了解 JVM,你会发现,这不就是 JVM 标记清除垃圾回收算法的核心思想吗?没错,数据结构和算法的魅力就在于此,很多时候我们并不是要去死记硬背某个数据结构或者算法,而是要学习它背后的思想和处理技巧,这些东西才是最有价值的。如果你细心留意,不管是在软件开发还是架构设计中,总能找到某些算法和数据结构的影子。

此文章为5月Day9学习笔记,内容来源于极客时间《数据结构与算法之美》文章来源地址https://www.toymoban.com/news/detail-437970.html

到了这里,关于数组低效的“插入”和“删除”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET 数据库大数据操作方案(插入、更新、删除、查询 、插入或更新)

    海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库达到极限性能,当然你如果不用sqlsugar了解一下原理也可以使用其他ORM实现   BulkCopy是一种用于高效批量插入大量数据

    2024年02月08日
    浏览(33)
  • 【⑨MySQL数据管理】:插入、修改、删除操作

    前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据插入、修改、删除的讲解 ✨ 一、插入数据 使用 INSERT INTO 语句来向表中插入数据 ✨ 语法: 给指定字段添加数据 给全部字段添加数据 批量添加数据( 用单条 INSERT 语句处理多个插入要比使用多条 INSERT 语句更快 ) 语法

    2024年02月16日
    浏览(30)
  • 【数据结构】单链表基本操作:查找、插入、删除、创建

     链表由结点组成,结点由数据域和指针域组成。其中,数据域存放的就是数据元素,指针域存放下一个结点的地址。数据元素可以只有一个,也可以有多个不同类型的数据元素,甚至是数组。下图和代码来自《C Primer Plus》,该链表每个节结点同时含char类型和int类型。 ​​

    2024年02月02日
    浏览(41)
  • Python操作excel进行插入、删除行操作实例演示,利用xlwings库实现

    插入行演示采用正序遍历操作,直接使用 xlwings 提供的 sheet.api.Rows(\\\"行数\\\").Insert() 方法就能实现整行插入处理。 需要注意的是 ,如果是前插入,要避免再次检测到刚才匹配过的内容,以防循环反复插入原位置。 调整前: 处理过程: 调整后: 删除行演示采用逆序遍历操作,

    2023年04月08日
    浏览(28)
  • 单链表上基本操作的实现——建立,插入,查找,删除,表长。

    提示,可以根据目录,可以从 单链表的插入 删除——单链表的查找——单链表的建立 这样的顺序进行学习!!! 单链表的建立主要包括两种建立方法: 头插法 与 尾插法 。 基本步骤如下: 初始化一个单链表 每次取一个数据元素,* 插入到表尾/表头 *(导致于头插法,尾插

    2023年04月09日
    浏览(32)
  • B树 B+树(多路查找树)的介绍、插入和删除操作

    是一类特殊的树形结构,其每个节点可以包含多个和对应的指针,相比于二叉查找树,可以更高效地进行查找操作。 B树和B+树 其中B树是一种自平衡的多路查找树,其每个节点可以包含多个和对应的指针,且满足以下性质:多路查找树是一类特殊的树形结构,其

    2023年04月18日
    浏览(27)
  • C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

    目录 一、成员访问 1、operator[ ]at 2、front( )back( ) 二、插入元素 insert( ) 三、删除元素 erase( ) 四、替换元素 replace( ) 五、查找元素 find( ) 六、交换字符串 swap( ) 七、C风格 c_str 八、rfindsubstr 虽然二者功能一样,但[ ]比较常用。 访问越界[ ]会直接报错,.at( )会抛异常。 insert/er

    2024年02月05日
    浏览(30)
  • C语言中实现顺序表的插入、删除和更新操作(附带源码)

    C语言中,顺序表是一种线性表的存储结构,可以通过数组来实现。以下是顺序表的插入、删除和更新操作的基本示例: 删除操作: 更新操作: 这些示例代码演示了如何在C语言中实现顺序表的插入、删除和更新操作。你可以根据需要进行修改和扩展。 希望你也学会了,更多

    2024年01月24日
    浏览(33)
  • ElasticSearch中批量操作(批量查询_mget、批量插入删除_bulk)

    有时候可以通过批量操作来减少网络请求。如:批量查询、批量插入数据。 当某一条数据不存在,不影响整体响应,需要通过found的值进行判断是否查询到数据。          在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。 请求格式如下:(

    2024年02月12日
    浏览(37)
  • (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)

    目录   一、普通的顺序存储队列 二、循环队列 (1)少用一个元素空间 i、初始化队列操作: iii、入队操作: iv、出队操作: (2)设置flag标志 i、初始化队列操作: ii、判断队空操作: iii、入队操作: iv、出队操作: (3)设置length存储队列元素的个数 i、初始化队列操作

    2024年01月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包