2-数组和链表


前言

这节主要是讲述基本的两种数据结构:数组和链表。
【注】:这里的数组要和Python列表区分开来,虽然列表大部分情况下可以当中数组使用,但数据结构里面的数组和Python列表还是有一些区别的。

一、数组

1 内存中数组的连续存储

【注】:在Python中我们一般将列表当数组用,下面代码中也是这样。但有些细微的差别需要注意,特别是在做算法题的时候。

数组(array)是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的索引(index)。下图展示了数组的主要概念和存储方式。
总之,记住数组在内存条里面存储是连续内存存储的。
在这里插入图片描述

2 数组的常用操作

(1)初始化数组

我们可以根据需求选用数组的两种初始化方式:无初始值、给定初始值。在未指定初始值的情况下,大多数编程语言会将数组元素初始化为 0:
【注】:数组初始化过后,数组的长度就固定了。这点和Python列表不一样哟。

# 初始化数组
arr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]
nums: list[int] = [1, 3, 2, 5, 4]

(2)数组的元素访问 — 内存知识

数组元素被存储在连续的内存空间中,这意味着计算数组元素的内存地址非常容易。给定数组内存地址(首元素内存地址)和某个元素的索引,我们可以使用下图所示的公式计算得到该元素的内存地址,从而直接访问该元素。
解释一下 数组内存地址=首原始地址。因为数组是连续存储,知道首元素地址不就知道数组了。很明显这又是一个节省内存的设计。
在这里插入图片描述
观察上图,我们发现数组首个元素的索引为 0,这似乎有些反直觉,因为从 1开始计数会更自然。但从地址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是0 ,因此它的索引为 0是合理的。
正是这种偏移量的设计,在数组中访问元素非常高效,我们可以在 O ( 1 ) O(1) O(1)时间内随机访问数组中的任意一个元素。
因此我们只用通过元素的索引就可以快速的访问数组元素。

arr = [1,2,3]
print(arr[1])     # 2

(3)插入元素

这里数组插入元素就会存在一些麻烦的问题了和列表相比。

  • 数组元素在内存中是“紧挨着的”,它们之间没有空间再存放任何数据。如图 4-3 所示,如果想在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。
  • 由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素“丢失”。我们将这个问题的解决方案留在“列表”章节中讨论。

在这里插入图片描述

def insert(nums: list[int], num: int, index: int):
    """在数组的索引 index 处插入元素 num"""
    # 把索引 index 以及之后的所有元素向后移动一位
    for i in range(len(nums) - 1, index, -1):</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值