9.1 定长数组的特点
定长数组 —— 这是在创建时确定大小的数组,并且 在程序运行中无法更改。在 Python 中,可以通过 库 array
创建定长数组,或者使用列表,尽管 Python 中的列表可以改变大小,但它们的用法与其他语言中的数组类似。
定长数组的特点:
- 固定大小: 数组的大小在创建时设置,无法更改。
- 单一类型: 数组中的所有元素必须是同一类型。
- 快速索引访问: 可以在恒定时间内
O(1)
访问数组元素。 - 大小不可变: 数组元素的数量保持不变,无法添加新元素。
在 Python 中创建定长数组的示例:
使用库 array
:
import array
# 创建整数数组(类型 'i' 代表 int)
arr = array.array('i', [1, 2, 3, 4, 5])
# 访问元素
print(arr[2]) # 输出: 3
# 改变元素的值
arr[2] = 10
print(arr) # 输出: array('i', [1, 2, 10, 4, 5])
使用列表(模拟定长数组):
# 创建固定大小的列表
arr = [0] * 5
# 初始化元素
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
# 访问元素
print(arr[2]) # 输出: 3
# 改变元素的值
arr[2] = 10
print(arr) # 输出: [1, 2, 10, 4, 5]
9.2 定长数组的优缺点
一切都有优缺点,定长数组也不例外。
优点:
- 快速索引访问: 可以在恒定时间
O(1)
内访问数组中的任意元素,使得数组在读取数据时非常高效。 - 实现简单: 数组易于理解和使用,可以轻松地在各种任务中实现和应用。
- 内存使用高效: 由于数组大小是固定的,因此在创建时立即分配内存,避免了内存重新分配的开销。
- 可预测性: 数组的固定大小简化了内存管理和资源使用的可预测性。
缺点:
- 大小不可变: 数组的大小在创建时设置,无法更改。这意味着需要提前知道数组所需的大小,或有可能导致内存过度分配。
- 插入和删除的成本: 插入和删除元素可能会消耗时间,因为需要移动元素。在最坏的情况下,在数组中间插入或删除元素需要
O(n)
的时间。 - 内存使用不高效: 如果数组未完全使用,剩余的内存空间将保持未填充,这可能导致内存使用不高效。
- 灵活性有限: 数组不允许动态更改大小,与动态数据结构(如列表)相比,它们的灵活性较差。
9.3 使用和应用示例
以下是一些定长数组的使用和应用示例。
示例 1: 表和矩阵
定长数组常用于表示表和矩阵,这些情况下大小是预先已知的。
import numpy as np
# 创建固定大小的 3x3 矩阵
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 访问矩阵元素
print(matrix[1][2]) # 输出: 6
# 修改矩阵元素
matrix[1][2] = 10
print(matrix)
# 输出:
# [[ 1 2 3]
# [ 4 5 10]
# [ 7 8 9]]
示例 2: 缓冲区和缓存
定长数组用于创建缓冲区和缓存,其中缓冲区的大小是预先已知的且不变。
# 用于读取数据的固定大小缓冲区
buffer_size = 1024
buffer = bytearray(buffer_size)
# 将数据填入缓冲区
data = b"Hello, World!"
buffer[:len(data)] = data
print(buffer[:len(data)]) # 输出: b'Hello, World!'
示例 3: 存储时间和日期的数据
定长数组可以用于存储时间和日期的数据,比如每个月的天数。
在这个例子中,我们通过 list
类模拟定长数组的行为:
# 每个月的天数(非闰年)
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 访问数据
month = 2 # 二月
print(f"二月有 {days_in_month[month - 1]} 天") # 输出: 二月有 28 天
GO TO FULL VERSION