怎样在数组末尾添加数据_数据结构学习(2)——数组

数组

数组是数据呈线性排列的一种数据结构。与前一节中的链表不同,在数组中,访问数据十分 简单,而添加和删除数据比较耗工夫。例如:

1. a 是数组的名字,后面“[ ]”中的数字表示该数 据是数组中的第几个数据(这个数字叫作“数 组下标”,下标从 0 开始计数)。比如,Red 就 是数组 a 的第 2 个数据。

5340765b39978e833554846e48795f3f.png

这就是数组的概念图。Blue、Yellow、Red作为数据存储在数组中。

2. 数据按顺序存储在内存的连续空间内

ea3aae958c24b1a84e568db6eaa027d6.png

3. 由于数据是存储在连续空间内的,所以每个数 据的内存地址(在内存上的位置)都可以通过 数组下标算出,我们也就可以借此直接访问目 标数据(这叫作“随机访问”)。

ac48469e68e9a8e569ed9059b6f08716.png

4. 比如现在我们想要访问Red。如果使用指针就只能从头开始查找,但在数组中,只需要指定 a[2],便能直接访问Red。

0e5db642b70142fa79ccd9ecc941b448.png

5. 但是,如果想在任意位置上添加或者删除数 据,数组的操作就要比链表复杂多了。这里我 们尝试将Green添加到第2个位置上。

bcc68daca76cf31a9f91106656b1037a.png

6. 首先,在数组的末尾确保需要增加的存储空间。

d8948ea9e87d678b9dcb6b9ecd342aa3.png

7. 为了给新数据腾出位置,要把已有数据一个个 移开。首先把Red往后移。

c40a0940a17c16c96760fe062f0c85fa.png

8. 然后把Yellow往后移。

ce42f3f359aa73dc53657c7c7ad0990c.png

9. 最后在空出来的位置上写入Green。

9f724142e4f484b422bb49e625fdc07d.png

10. 这样添加数据的操作就完成了。

ca9c1e9cb25018078769c6c3752d195f.png

11. 反过来,如果想要删除Green……

a4bfb42b31abdb778927197394cc3d79.png

12. 首先,删掉目标数据(在这里指Green)。

cdc2beef4b7267ef5cf74d3deecf8fe0.png

13. 然后把后面的数据一个个往空位移。先把 Yellow往前移。

2baf7028afc8ed64ad8857d032b7ee8e.png

14. 接下来移动Red

17615663b456902668ade667d1b2cf66.png

15. 最后再删掉多余的空间。这样一来Green便被删掉了。

6ac0eefb193cac320e84a976e0306bc0.png

解说

这里讲解一下对数组操作所花费的运行时间。

假设数组中有n 个数据,由于访问数 据时使用的是随机访问(通过下标可计算出内存地址),所以需要的运行时间仅为恒定的 O(1)。

但另一方面,想要向数组中添加新数据时,必须把目标位置后面的数据一个个移 开。所以,如果在数组头部添加数据,就需要 O(n) 的时间。删除操作同理。

链表与数组的比较

在链表和数组中,数据都是线性地排成一列。

  • 在链表中访问数据较为复杂,添加和 删除数据较为简单;
  • 而在数组中访问数据比较简单,添加和删除数据却比较复杂。

我们可以根据哪种操作较为频繁来决定使用哪种数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值