线性表---顺序表

什么是顺序表

顺序表(Sequence List)是一种基于数组实现的线性表,它将元素存储在连续的内存空间中,通过下标来访问和操作每个元素。顺序表的特点是支持随机访问,可以在O(1)的时间复杂度内访问任意位置的元素。

顺序表的基本结构

  • 元素存储区

一个固定大小的数组,用于存储线性表中的元素

  • 长度信息

一个固定大小的数组,用于存储线性表中的元素

*长度信息表示当前线性表的长度,即元素的个数。顺序表的长度可以动态增长或缩小,但是需要重新分配内存空间,因此在实现时需要考虑内存管理的问题。

顺序表的基本操作

  1. 插入
  2. 删除
  3. 查找
  4. 遍历

其中插入和删除操作的时间复杂度为O(n),因为需要移动元素位置,而查找和遍历操作的时间复杂度为O(1)

顺序表的优缺点

  1. 顺序表常用于实现数组、矩阵、字符串等数据结构,具有简单、高效的特点
  2. 顺序表的大小固定,当线性表的长度超过数组大小时,需要重新分配内存空间,这会引起内存碎片和性能问题。

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内置的列表一样使用顺序表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值