什么是顺序表
顺序表(Sequence List)是一种基于数组实现的线性表,它将元素存储在连续的内存空间中,通过下标来访问和操作每个元素。顺序表的特点是支持随机访问,可以在O(1)的时间复杂度内访问任意位置的元素。
顺序表的基本结构
- 元素存储区
一个固定大小的数组,用于存储线性表中的元素
- 长度信息
一个固定大小的数组,用于存储线性表中的元素
*长度信息表示当前线性表的长度,即元素的个数。顺序表的长度可以动态增长或缩小,但是需要重新分配内存空间,因此在实现时需要考虑内存管理的问题。
顺序表的基本操作
- 插入
- 删除
- 查找
- 遍历
其中插入和删除操作的时间复杂度为O(n),因为需要移动元素位置,而查找和遍历操作的时间复杂度为O(1)。
顺序表的优缺点
- 顺序表常用于实现数组、矩阵、字符串等数据结构,具有简单、高效的特点
- 顺序表的大小固定,当线性表的长度超过数组大小时,需要重新分配内存空间,这会引起内存碎片和性能问题。
python实现
1. 创建顺序表类
class SqList:
# 初始化类属性
def __init__(self, capacity):
self.capacity = capacity #设置初始容量
self.length = 0 # 长度
self.data = [None] * capacity # 根据长度创建数组,用于储存数据
# 修改顺序表的大小,实现动态增长或缩小
def _resize(self, new_capacity):
new_data = [None] * new_capacity
for i in range(self.length):
new_data[i] = self.data[i]
self.data = new_data
self.capacity = new_capacity
def __len__(self):
return self.length
# 实现类似列表操作
def __getitem__(self, index):
if not 0 <= index < self.length:
raise IndexError('Index out of range')
return self.data[index]
def __setitem__(self, index, value):
if not 0 <= index < self.length:
raise IndexError('Index out of range')
self.data[index] = value
def __str__(self):
return '[' + ', '.join(str(self.data[i]) for i in range(self.length)) + ']'
2. 操作的实现
# 添加
def append(self, value):
if self.length == self.capacity:
self._resize(2 * self.capacity)
self.data[self.length] = value
self.length += 1
# 插入
def insert(self, index, value):
if index < 0 or index > self.length:
raise IndexError('Index out of range')
if self.length == self.capacity:
self._resize(2 * self.capacity)
for i in range(self.length, index, -1):
self.data[i] = self.data[i - 1]
self.data[index] = value
self.length += 1
# 删除(最后一个)
def pop(self):
if self.length == 0:
raise IndexError('Pop from empty list')
self.length -= 1
value = self.data[self.length]
self.data[self.length] = None
if self.length < self.capacity // 4:
self._resize(self.capacity // 2)
return value
# 删除指定元素
def remove(self, value):
for i in range(self.length):
if self.data[i] == value:
for j in range(i, self.length - 1):
self.data[j] = self.data[j + 1]
self.length -= 1
self.data[self.length] = None
if self.length < self.capacity // 4:
self._resize(self.capacity // 2)
return
raise ValueError('Value not found')
3.顺序表的创建
# 定义函数,将列表里的元素按顺序存入顺序表
def list_to_sq(lst):
sq = SqList(len(lst))
for i, val in enumerate(lst):
sq.append(val)
return sq
总结
这里我们定义了一个名为SqList的类,它有以下方法:
init(self, capacity):初始化一个容量为capacity的空列表。
len(self):返回列表的长度。
getitem(self, index):获取列表中索引为index的元素。
setitem(self, index, value):将列表中索引为index的元素设置为value。
str(self):返回列表的字符串表示。
append(self, value):将value添加到列表的末尾。
insert(self, index, value):将value插入到列表中索引为index的位置。
pop(self):从列表末尾弹出一个元素,并返回该元素。
remove(self, value):从列表中删除值为value的元素。
这些方法可以让我们像使用Python内置的列表一样使用顺序表。