大家好呀,我是蛋蛋。瞎起题目的嘴强王者,乱写界的无冕之王。

提到数组,想必臭宝们都不陌生。说不定已经昂起脑瓜抖着腿,小眼神儿斜着来一句:“就那个随随便便用脚趾甲就能学会的数组?”

数组,你确定很简单?

自信点,语气肯定点,数组确实很简单。

但是我还要讲。

当然开始之前,你要确定你先看过下面这篇:

保姆级教学!彻底学会时间复杂度和空间复杂度

。。。


数组,一种基础的的线性数据结构。不管写什么代码基本上都会用到数组,它也是面试中面试官喜欢提问的高频问题。

鉴于它劳模的身份,对数组的考察基本都是考察代码方面的问题。

但是万变不离其宗,解决数组方面问题的万能钥匙,其实就是深刻的认识数组本身的深浅。

什么是数组?

首先什么是数组?

数组是一种基础的线性数据结构,它是用连续的一段内存空间,来存储相同数据类型数据的集合。

这里面有两个重点:

  • 线性数据结构

  • 连续内存存储相同数据类型

线性数据结构

线性数据结构,顾名思义,像线一样的数据结构,又硬又直的典型代表。

线性数据结构是有限的,它是某类元素的集合并且记录着元素之间的一组顺序关系,除了首尾之外,其余元素之间有且只有一个前驱和后继

除了数组以外,像单链表、栈、队列等也是典型的线性数据结构。

连续内存存储的相同数据类型

以一个长度为 6 的 int 类型的数组为例,理解一下“连续内存存储相同数据类型”数组的样砸。

上图中的计算机给数组 a 分配了一块连续的内存空间 1000 - 1005,首地址 address[0] = 1000。

因为连续,且对于数组来说下标从 0 开始的,所有对于数组中的每个元素来说,它的内存地址就很好计算:

address[i] = address[0] + i 

数组的操作

从上面可以看出,连续内存存储使得数组有一个天然的优势,这个优势就是可以根据下标,快速的随意访问任意一个位置的数**组元素。**

因为数组可以保证不管你访问哪个元素,只要给出下标,只需进行一次操作,就可以定位到元素的位置,从而拿出这个位置上的值。

这步操作的时间复杂度就是 O(1)。

当然 God 是公平的,在查找上让数组当了快男,那必定让它在插入和删除上加上“持久”技能点。

在这你要明白,持久意味着花的时间多(低效)。这么看来,在数据结构与算法中,秒男成了褒义词。

这种插入和删除的“持久”,是如何产生的呢?

这还是要从“连续内存存储”上找原因,真所谓快也它,慢也它。

连续的内存使得在插入或者删除的元素的时候,其它元素也要相应的移动。

比如我们在下标为 2 的位置上插入一个元素 29:

为了保持连续内存存储,在下标为 2 的位置上插入 29,原先 2 - 5 下标位置上元素都要向后一步走,可以看出这一步操作的时间复杂度为 O(n)。

当然在这我必须要强调一点的是,插入的时间复杂度其实根据情况的不同而不同,在这里主要因为 懒 手疼,没有都列出来,毕竟我的臭宝们是最聪明哒。

一般我都是按照最坏情况时间复杂度来算。对于插入来说,最好的情况肯定是插在末尾,这样所有的元素都不用动,时间复杂度为 O(1),那最坏的情况就是在数组的开头插入,这样所有的元素都要动,时间复杂度就成了 O(n),请大家一定要注意。

对删除来说,和插入操作也差不多,比如我们删除下标为 2 位置上的元素。

删除了下标 2 位置上的数字 a[2], 原来下标 3 - 5 位置上的元素统统向前一步走。

同样对于删除来说,最好情况是删除末尾的元素,时间复杂度为 O(1),最坏的情况是删除首位的元素,时间复杂度是 O(n)。

数组的查找、插入和删除这 3 个操作讲完以后,还有最后一点提醒一下大家,在做数组类问题的时候要注意数组越界的问题。

数组越界,简单来说就是对于一个大小为 n 的数组,它的下标应是 0 到 n-1,对这 n 个位置的元素之外的访问,就是非法的,这就叫做“越界”。

比如对于下面这两行代码:

lst = [1,2,3,4]
print(lst[4])

编译一下,就会提示 IndexError : list index out of range。

臭宝们平时写数组的时候一定要注意,不然一不小心就 out 了。


到这里,简单的数组就讲完啦,能忍着看到这的都是真爱呀。码字码的手都痛啦,点赞么么哒给我刷起来~

我是蛋蛋,咱们下次见~

推荐阅读

【图解】ACM 选手带你玩转数组。相关推荐

  1. 【实战】ACM 选手图解 LeetCode 设计链表

    大家好呀,我是蛋蛋. 今天来设计链表,强行学明白链表的 5 种操作. 板凳摆好,直接开整. LeetCode 107:设计链表 题意 实现链表的查找.头插法.尾插法.通用插入.删除操作: get(in ...

  2. 悠漓带你玩转C语言(数组)

    1. 一维数组的创建和初始化. 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //co ...

  3. 视频教程-迈向数据科学家:带你玩转Python数据分析-Python

    迈向数据科学家:带你玩转Python数据分析 苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门><跟老齐学Python ...

  4. NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具

    导读:NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能. 在处理自然语言过程中,需要将文字(中文或其他语言)转换为向量.即把对文本内容的处理 ...

  5. 知道的C君带你学语言的作业答案,知到《C君带你玩编程》2020章节测试(含答案)...

    <知到<C君带你玩编程>2020章节测试(含答案)>由会员分享,可在线阅读,更多相关<知到<C君带你玩编程>2020章节测试(含答案)(16页珍藏版)> ...

  6. 带新手玩转MVC——不讲道理就是干(上)

    带新手玩转MVC--不讲道理就是干(上) 前言:这几天更新了几篇博客,都是关于Servlet.JSP的理解,后来又写了两种Web开发模式,发现阅读量还可以,说明JSP还是受关注的,之前有朋友评论说JS ...

  7. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA(含CD光盘1张)(双色)(附带近500个VBA思考练习题,Exceltip.net出品) 罗刚君  杨嘉恺编著 ISBN 978-7-121-20627-6 201 ...

  8. 来吧 带你玩转 Excel VBA

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 来吧!带 ...

  9. 老宇哥带你玩转 ESP32:04 串口玩起来是真方便

    今天我们来玩儿串口. 概述 ESP32 芯片有3 个 UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达 5Mbps,3 个接口可以被 DMA 或 CPU ...

最新文章

  1. Windows文件系统过滤驱动开发教程(0,1,2)
  2. 浅谈 LiveData 的通知机制
  3. vistualSVN server:Windows下SVN服务器利器
  4. 2.12.ECMAScript--运算符
  5. 看看腾讯是怎么做产品设计分析的 - 腾讯QQ音乐业务产品规划
  6. CoreCLR源码探索(三) GC内存分配器的内部实现
  7. 遍历文件夹下所有文件和文件夹
  8. android 将图片路径转二进制,将图像转换为二进制图像中的android
  9. 彷徨了两天,天慢慢晴朗了,心也爽朗了……
  10. windows删除「WIN+R」的历史记录
  11. 使用CSS3关键帧动画创建的动态通知气泡
  12. 2022年鲜花行业发展趋势
  13. delphi android 升级,delphi android 自动升级
  14. 人工智能基础——知识的表示方法,语义网络表示方法
  15. NDEF格式的smart tag在Mifare UltraLight卡中的存储方式
  16. 搜狗输入法乱码 解决
  17. Flink 在风控场景实时特征落地实战
  18. 计算IP地址的有效范围
  19. [linux]platform总线机制与wtd驱动开发
  20. 致敬2020——打工人的成长故事

热门文章

  1. html display none取消,display none是什么意思?
  2. android 按钮绚丽样式,Android实现绚丽的旋转菜单
  3. Java 用Ajax的方法
  4. Pako解决Post请求报文过大的问题
  5. 学习笔记:操作系统启动过程
  6. (php毕业设计)基于php毕业生招聘管理系统源码
  7. 苹果专用充电宝品牌,iphone专用充电宝推荐
  8. Sketch之Symbol使用
  9. Bootstrap 弹出框
  10. python验证中心极限定理_中心极限定理的最最通俗解释