含泪总结篇:数据结构——数组

数据结构—数组

注:此文档《数据结构与算法之美》的课上学习和自习总结的。属于原创文章,如发现错误,请指出

系列文章
什么是数据结构?什么是算法?
数据结构—数组
数据结构—链表
数据结构—栈
数据结构—队列
数据结构—排序

知识点回顾

上篇文章说到了什么是数据结构什么是算法,大家有兴趣的可以去看下,我也在不断的完善中。大吉大利。

  • 概念:什么是数据结构?什么是算法

    • 广义:数据结构是指一组数据的存储结构,算法就是操作数据的一组方法

    • 狭义:指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等 数据结构和算法是为了解决如何更快更省的存储和处理数据。

  • 关系:数据结构和算法的关系

    • 数据结构和算法相辅相成,数据结构为算法服务,算法要作用在特定的数据结构之上,

    • 比如:因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。

  • 重点是什么?

    • 复杂度分析——是数据结构和算法的精髓

了解下数组

数组

  • 数组(Array)是一种线性表数据结构。它用一组连续的内存空来存储一组具有相同类型的数据。

    • 特点:
    1. 线性表。

    2. 连续的内存空间和相同的数据类型(随机访问)

    3. 支持随机访问:即查找比较快,根据下标随机访问的时间复杂度是O(1)

    4. 因为是连续的内存空间,插入和删除比较低效

  • 数组的寻址公式:

    • a[i]_address = base_address + i * data_type_size ( 其中 data_type_size 表示数组中每个元素的大小)
  • 如何优化插入操作?

    • 先把插入的位置的元素取出,然后在把插入的值复制到插入的位置,最后再把取出的元素放在末尾。这样的时间复杂度为O(1)

    • 如何优化删除操作?(这里不是很懂,有朋友可以解释下嘛?)

      • 将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作,这样减少数据搬移次数节省耗时。这也是跟 JVM 标记清除垃圾回收算法的核心思想。
  • 提问1:容器是否可以替代数组呢?

    • 容器支持动态扩容(额外知识点:扩容操作涉及内存申请和数据迁移,是比较耗时的,如果可以确定容器的大小,最好在初始化的时候确定容器大小)

    • 容器不能存储基本数据类型(需要装箱)

    • 总结:如果是底层开发,需要性能优化到极致,建议只有数组。或者知道数据大小,数据操作比较简单,可以用数组

  • 提问2:为什么数组下标从0开始呢?而不是1呢?

    • C语音设计的时候开始就是0下标,java等高级语音都模仿了C语言的一些习惯,减少学习成本。
  • 提问3:链表和数组的异同

    • 同:都是线性表 异:链表插入删除快 时间复杂度O(1) 数组支持随机访问,带下标访问时时间复杂度为O(1)

    • 异:数组需要连续的内存空间,对内存要求高,比如我们需要申请100M的大小的数组,但是没有连续的100M内存,即使剩余内存大于100M仍然会申请失败,但是链表不会,它不需要连续的内存空间,可以通过“指针”将连续的内存块串联起来使用。

    • 链表需要额外的内存空间存储指针,所以相同数据,链表空间消耗更大。


题外话:谢谢大家观看,有不足之处欢迎大家一起讨论;码字不易,大家喜欢,麻烦点赞哦。


灵魂三问:

  • 有没有觉得技术得不到系统的提升,技术成长慢?
  • 有没面试懵逼,升职加薪难?
  • 有没有想过去大一点的世界看看?

有期望JAVA技术巩固的、Android知识进阶的、期望升职加薪的、Android面试技巧的大厂面试真题的;大家可以加我QQ哦:1070800492。我们一起学习,一起进步!

重要的事情说三遍:

  • 学习、挣钱、自由
  • 学习、挣钱、自由
  • 学习、挣钱、自由

疫情当下,唯有自强

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值