1. 为什么数组是从0开始不是从1开始呢
  2. 什么是数组?数组(Array)是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据
  3. 第一个是线性表(Linear List)线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。除了数组,链表、队列、栈等等也是线性表结构
  4. 与线性表对立的概念是非线性表,比如二叉树、堆、图等等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系
  5. 第二个是连续的内存空间和相同类型的数据。正是因为这两个限制,他才有了堪称杀手锏的特性“随机访问”。
  6. 但是这两个限制也让数组的很多操作变得非常低效,比如在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作
  7. 数组是如何实现根据下标随机访问数组元素的????
  8. int[] a = new int [10]  内存块的首地址为base_address=1000
  9. 计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,会使用这个寻址公式,计算出该元素存储的内存地址 a[i]_address = base_address + i * data_type_size
  10. data_type_size表示数组中每个元素的大小
  11. 数组和链表的区别:链表适合插入、删除,数组适合查找,数组支持随机访问,根据下标随机访问的时间复杂度为O(1)
  12. 数组中低效的插入操作:假设数组长度为n,把一个数据插入到数组的第k个位置。为了给她腾位置,需要将第k~n的元素顺后挪一位。
  13. 最好的情况在末尾插入,不需要移动其他数据,时间复杂度为O(1)。但如果在数组的开头插入元素,那所有的数据都要往后挪一位,时间复杂度为O(n),随机插入的话平均情况时间复杂度为O(n).
  14. 为了避免大规模数据迁移,可以把第K个位置的元素移到最后,把新的元素直接放入k位置,这样的话时间复杂度O(1)
  15. 数组中的删除操作,跟插入数据类似,如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了
  16. 和插入类似,删除末尾元素,则最好情况时间复杂度为O(1),如果删除开头的数据,则最坏情况时间复杂度为O(n);平均情况时间复杂度也为O(n)
  17. 实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率会提高很多。
  18. 类似于JVM标记清除垃圾回收算法的核心思想
  19. 警惕数组的访问越界问题
  20. 容器能否完全代替数组,针对数组类型,很多语言都提供了容器类,比如java的ArrayList,与数组相比有什么优势呢
  21. ArrayList最大的优势就是可以将很多数组操作的细节封装起来。比如前面提到的数组插入、删除数据时需要搬移其他数据等。并且他支持动态扩容
  22. 数组本身在定义的时候需要预先指定大小,因为需要分配连续的内存空间。如果我们申请了大小为10 的数组,当第11个数据需要存储时会重新分配一块更大的空间,将原来的数据复制过去,再将新的数据插入。
  23. 使用ArrayList,每次存储空间不足都会将空间自动扩容为1.5倍大小,因为扩容操作比较耗时,涉及到内存申请和数据搬移,所以我们可以在创建ArrayList的时候事先指定数据大小
  24. 当然了 数组也有很多适用场景
  • ArrayList无法存储基本类型,比如int,long,需要封装为Integer、Long类,而Autoboxing、Unboxing则由一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以用数组
  • 如果数据大小已知,并且对数据的操作非常简单,用不到ArrayList提供的大部分方法,也可以直接使用数组
  • 表示多维数组时,用数组往往会更加直观,比如Objectp[][] array;用容器的话:ArrayList<ArrayList> array.
  • 对于业务开发,直接使用容器就足够了。底层开发还是数组,开发网络框架 性能的优化需要做到极致的时候 首选数组

总结:C语言设计者用0开始计数数组下标,之后的Java,JS等高级语言都效仿了C语言,或者说为了减少C语言工程师的学习Java成本,因此而为之。也有些语言,MatLab的数组不是从0开始计算。像Python支持负数下标

数据结构与算法分析(三)数组相关推荐

  1. 1.[数据结构和算法分析笔记]数组

    1.数组的定义 数组是n(n>=1)个相同/数据类型的数据元素a0,a1,a2,-an-1,存储在地址/连续的/内存单元的/有限集合. Java中数组是用来存储/同一种/数据类型的/数据,一旦初 ...

  2. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  3. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...

    数据结构与算法分析 1.在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关. 2.如果有两个数,每个数的所有约数(除它本身以外)的和正好等 ...

  4. python数据结构与算法分析_数据结构和算法分析

    问题引出 假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路: 1.将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法, ...

  5. 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了,想复制完整代码直接复制最下面的,想复制分布代码去看我博客园链接吧 <数据结构与算法分析>课程设计--迷宫问题 - 刷子 ...

  6. 数据结构:串、数组和广义表

    串 线性结构:线性表.栈和队列.串与数组和广义表 串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集.在基本操作上,串和线性表有很大差别.线性表的基本操作主要以单个元素作为操作对象,如查 ...

  7. 数据结构与算法分析(十六)--- 如何设计更高效的字符串匹配算法?(BF + RK + KMP + BMH)

    文章目录 一.Brute Force 匹配算法 二.Rabin–Karp 匹配算法 三.Knuth–Morris–Pratt 匹配算法 四.Boyer-Moore-Horspool 匹配算法 五.字符 ...

  8. 计算机考研科目887,2017年华中科技大学887数据结构与算法分析考研试题

    2017年华中科技大学887数据结构与算法分析考研试题本站小编 免费考研网/2020-02-27 一.名词解释(25分,1个5分) 1.1堆分配存储表示 1.2完全图 1.3树的结点层次 1.4拓扑排 ...

  9. 【西电-网信院】数据结构与算法分析2022期末考试

    数据结构与算法分析2022网信院期末考试 一.选择题 二.判断题 三.填空题 四.问题求解 五.算法设计 题型:选择20(2*10)+判断10(1*10)+填空(2*10)+问题求解30(7+7+8+ ...

  10. 数据结构与算法分析 作业讲解文档目录

     参考教材:<数据结构(C语言版 第2版)> 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版.   对应的作业题讲解视频: 数据结构与算法分析作业讲解视频合集https://ww ...

最新文章

  1. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech
  2. 模仿JavaAppArguments.java示例
  3. 技术交流论坛_研发部第四次技术交流论坛
  4. 视觉SLAM——稀疏光流法
  5. 人群与网络:网络流量博弈,拍卖、匹配市场
  6. [ 1003 ] 判断小偷那些事
  7. matlab复杂网络上的博弈演化,科学网—复杂网络上的演化博弈研究 - 汪秉宏的博文...
  8. 流媒体RTMP协议解析
  9. 了解RecyclerView的分割线
  10. php注册账号绑定微信,PHP-微信公众账号中的一键绑定该怎么设计
  11. Spring Boot-入门
  12. 【数据结构】有限状态自动机(FSA)的理解-LeetCode表示数值的字符串(有效数字)题解(Java)
  13. 员工转正申请书_有限公司新员工转正申请书
  14. 提交和复位按钮的知识(Submit Reset Buttons)
  15. scrcpy - 手机无线投屏到电脑
  16. 最新中国省市区县geoJSON格式地图数据Echarts地图数据
  17. 完全用Linux工作——看清华学子痛批Windows
  18. Windows平板 触摸屏 快速屏蔽/开启 快捷键
  19. UKF VS EKF
  20. C/C++语言优秀书籍清单,新手入门必看

热门文章

  1. 关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法
  2. 爬虫——cookie模拟登陆
  3. 小米推出android+one,小米新机搭载Android One,并不采用MIUI!
  4. iOS判断是否是最新的版本
  5. “光驱不见了”的解决方法
  6. 世界各国电压等级及频率
  7. ThreadLocal作用、原理以及问题
  8. (转载)很全很强大的官方API集合
  9. linux 冷启动命令,鸟哥的 Linux 私房菜7 -- 首次开机关机与基本指令执行
  10. 时人品牌咨询:一个与众不同的品牌咨询公司是如何诞生的?