算法—顺序表之列表的扩容机制(python实现)

顺序表中增加元素
在尾部增加元素:时间复杂度为O(1)
在这里插入图片描述
在任意位置插入元素:时间复杂度为O(n)
在这里插入图片描述
顺序表中删除元素

删除尾部元素:时间复杂度为O(1)
删除任意位置元素:时间复杂度为O(n)

PY_SSIZE_T_MAX=float('inf')     #最大的容量
obj_size=1
class List:
    allocated=0		#容量默认为0
    size=0			#元素个数默认为0
    items=[]		#数据区默认为空
    def list_resize(self,new_size):
        '''
        self:列表本身对象
        :param new_size:修改之后的元素个数
        :return:
        '''
        allocated=self.allocated       #获取列表对象当前的容量
        #allocated>>1==>allocated//2
        if allocated>=new_size and new_size>=(allocated>>1):
            self.size=new_size
            return 0
        #计算需要的内存容量时多少
        new_allocated=new_size+(new_size>>3)+(3 if new_size<9 else 6)
        if new_allocated>PY_SSIZE_T_MAX:    #判断是否超过了最大值
            return -1

        if new_size==0:
            new_allocated=0

        #计算我们容量需要的字节数
        num_allocated_bytes=new_allocated*obj_size
        #获取到新的内存空间的地址
        items=addr(self.items,num_allocated_bytes)
        if items==None:
            return -1
        #让列表对象的数据区地址指向新的内存空间地址
        self.items=items
        self.size=new_size
        self.allocated=allocated

lst=List()
result=lst.list_resize(4)
print(result)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值