数据结构与算法:数组(Array)

288 阅读2分钟

这是我参与更文挑战的第10天,活动详情查看: 更文挑战

什么是数组?

  1. 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
  2. 第二个是连续的内存空间和相同类型的数据
  3. 优点:两限制使得具有随机访问的特性缺点:删除,插入数据效率低

什么是线性表结构

线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。

非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。

imgimg

如何实现根据下标随机访问数组元素的吗?

a[i]_address = base_address + i * data_type_size

base_address 内存块的首地址

data_type_size 表示数组中每个元素的大小

数组的复杂度?

链表适合插入、删除,时间复杂度O(1);数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。

为什么数据需要从0开始呢?

  1. 存储的内存模型上来看,下标”最确切的定义应该是“偏移(offset);a[0]就是偏移为0的位置,也就是首地址;如果从1开始,计算的时候需要多做一次减法操作;效率的优化不够极致
  2. 历史的原因;C语言设计者用0开始计数数组下标,降低学习成本

如果数组从1开始计数,那计算数组元素a[k]的内存地址就会变为:

a[k]_address = base_address + (k-1)*type_size

对比两个公式,不难发现,从1开始编号,每次随机访问数组元素都多了一次减法运算,对于CPU来说,就是多了一次减法指令。