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