数据结构和算法二(数组)

Posted jakablog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法二(数组)相关的知识,希望对你有一定的参考价值。

一、数组

1.概念

  • 数组是一种线性表数据结构,它用一种连续的内存空间,来存储一组具有相同类型的数据。
  • 线性表:数组、链表、队列、栈等
  • 非线性表:二叉树、堆、图等

2.连续的内存空间和相同类型的数据

  • 优点:具有随机范文的特性,根据下标随机访问的时间复杂度为O(1)
  • 缺点:低效的插入和删除
    • 插入:最好O(1),最坏O(n),平均O(n)
    • 插入:数组若无序,插入新的元素时,可以将第K个位置元素移动到数组末尾,把新的元素插入到第K个位置,此时复杂度为O(1)
    • 删除:最好(1),最坏O(n),平均O(n)
    • 将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作。这也是 JVM 标记除垃圾回收算法的核心思

3.使用数组还是容器

  • 数组必须先指定空间的大小,而容器例如ArrayList可以动态的扩容(扩容时比较耗内存,因为涉及到内存申请及数据的搬移)
  • 如果要存储基本的数据类型,可以用数组;容器无法存储基本类型,只能存储基本类型的包装类型,这样在装箱拆箱时会损耗性能
  • 事先知道数据大小,并且操作简单,可以用数组
  • 直观表示多维,可以用数组,例如Object[][],用容器时只能是ArrayList;
  • 业务开发一般使用容器,开发框架,追求性能时,优先考虑数组。

4.为什么数组从0开始编号

由于数组是通过寻址公式计算该元素存储的内存地址的

a[i]_address = base_arress+i*data_type_size

如果数组是从1开始计数,那么公式就会变为

a[i]_address = base_arress+(i-1)*data_type_size

对于CPU来说,多了一次减法的指令。当然,还有历史原因,这个自己搜索去。

以上是关于数据结构和算法二(数组)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA数据结构与算法之顺序存储二叉树

数据算法Java实现二叉树存储以及遍历

C++提高笔记(二:容器和常用算法部分)

数据结构与算法学习笔记 串,数组和广义表

数据结构与算法二 ---数组

数据结构与算法二 ---数组