1、动态数组(array)

本文探讨了动态数组的概念,强调了其预分配内存的特性,以及添加、删除元素时可能面临的复杂度问题,包括内存复制和元素移动。动态数组在不同操作中的时间复杂度有所不同,随机访问的时间复杂度为O(1),但插入和删除可能达到O(n)。文章还提到了基于动态数组实现自定义类的需求。
摘要由CSDN通过智能技术生成
1、数组(array vs list)

array: 定长,操作有限,但是节省内存,可以用import array直接导入

list: 会预先分配内存,操作丰富,但是耗费内存。

  • list.append: 如果之前没有分配够内存,会重新开辟新区域,然后复制之前的数据,复杂度退化
  • list.insert: 会移动被插入区域后所有元素,O(n)
  • list.pop: pop不同位置需要的复杂度不同pop(0)O(1)复杂度,pop()O(n)复杂度
  • list[]: slice操作copy数据(预留空间)到另一个list

数组的特点:

  • 占用一段连续内存空间,支持随机(索引)访问,且时间复杂度为: O(1)
  • 添加、删除元素的时间复杂度为:O(n)

基于 Python list自己实现一个动态数组类 Array

# -*- coding: utf-8 -*-
"""
    Description: 数组
"""


class Array(object):
    """数组类定义"""

    def __init__(self, capacity=10):
        """初始化一个固定大小的空数组,默认数组大小为 10"""
        self._size = 0  # 数组有效元素的个数,初始化为0
        self._capacity = capacity
        # 由于 Python 的 list 是动态扩展的,而我们要实现的层具有固定容量,
        # 占用一段连续的内存空间的数组,所以用 None 来作为无效元素的标识
        self._data = [None] * self._capacity

    def __getitem__(self, index: int):
        """让 Array 支持索引"""
        assert 0 <= index < len(self._data), 'out of range'
        return self._data[index]

    def __setitem__(self, index: int, value):
        """修改数组指定位置的值"""
        assert 0 <= index < len(self._data), 'out of range'
        self._data[index] = value

    def __iter__(self):
        for item in self._data:
            yield item

    def __len__(self):
        return self._size

    def _resize(self, new_capacity):
        """数组容量缩放至 new_capacity,私有成员函数"""
        new_arr 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值