在编程语言中,数组不仅是一种基本的数据类型,也是一种基础的数据结构,它用于存储相同类型的数据,支持随机访问,时间复杂度为O(1),并且也支持随机插入和删除,但是时间复杂度为O(n)。
数组之所以能够进行随机访问,是因为当你在申请一个数组的时候,计算机给它分配了一块连续的存储空间,你只需要知道这个数组的首地址,就可以在O(1)时间复杂度内找到数组中的任意数据,具体的推导过程可以查看王争的数据结构与算法之美。但是插入和删除操作的平均时间复杂度为O(n),因为数组的插入和删除操作要进行数据搬迁,需要耗费主要的时间复杂度,具体的推导也可以自己去了解,本专栏是根据王争的数据结构与算法用python实现的,所以大部分精力会放在代码的实现上面,对于时间复杂度详细的推导过程需要你自己去了解。
在代码的实现过程中,我们首先需要创建一个数组类,将数组的初始化信息和所需要使用的方法都封装在这个类中。在创建一个数组时,我们需要指定数组的容量,所以要把容量作为参数传入初始化函数中。在python中,列表的内存空间是连续的,我们可以在初始化函数中定义一个列表来存储数组中的数据。这里要注意一点,虽然python中的列表和C语言中的数组的内存空间都是连续的,但是列表可以存储不同类型的变量,而数组只能存储同一类型的变量,他们有相似之处,但是并不相同。
def __init__(self, capacity: int):
self.data = [] # 用一个列表存储数组的数据
self.capacity = capacity # 在创建数组时,需要指定容量
对数组进行的操作通常有4种,插入操作、删除操作、查找操作、打印操作。在进行插入操作时,我们要指定插入位置(索引)和插入值,需要作为参数传入插入方法。执行插入操作时,首先要判断数组是否还有剩余空间,如果有就执行插入操作,这里调用python对于列表操作的内置函数insert方法,时间复杂度为O(n),满足我们的要求;如果没有剩余空间就提示用户,并且不进行插入操作。
def insert(self, index: int, value: int):
if len(self.data) < self.capacity: # 容量没满就可以插入
self.data.insert(index, value) # 列表的insert方法平均时间复杂度为O(n)
else:
print("插入超出数组容量")
删除操作:删除指定位置的值,需要将索引传入删除函数。如果索引小于数组容量,利用python内置的pop方法执行删除操作,时间复杂度为O(n),否则提示用户索引越界。这里用到python的异常处理方法,try和except,try后面的代码成功执行,就返回,不然就执行except,读者可以自行去了解更具体的操作。
def delete(self, index):
try:
self.data.pop(index) # 列表的pop方法平均时间复杂度为O(n)
except IndexError:
print("删除索引越界")
查找操作:输入要查找的索引,返回索引位置的值。传入索引,如果索引小于数组容量就返回所查找位置的值,否则提示用户越界。
def find(self, index):
try:
return self.data[index] # 时间复杂度为O(1)
except IndexError:
print("查找索引越界")
打印操作:逐个打印数组中的值。这里用一个for循环。
def print_all(self):
for item in self.data: # self相当于类实例化的对象
print(item)
创建数组对象,编写程序入口,进行测试,完整代码如下:
class Array(object):
def __init__(self, capacity: int):
self.data = [] # 用一个列表存储数组的数据
self.capacity = capacity # 在创建数组时,需要指定容量
def insert(self, index: int, value: int):
if len(self.data) < self.capacity: # 容量没满就可以插入
self.data.insert(index, value) # 列表的insert方法平均时间复杂度为O(n)
else:
print("插入超出数组容量")
def delete(self, index):
try:
self.data.pop(index) # 列表的pop方法平均时间复杂度为O(n)
except IndexError:
print("删除索引越界")
def find(self, index):
try:
return self.data[index] # 时间复杂度为O(1)
except IndexError:
print("查找索引越界")
def print_all(self):
for item in self.data: # self相当于类实例化的对象
print(item)
arr = Array(5) # 创建一个容量为5的数组
if __name__ == '__main__':
arr.insert(0, 3)
arr.insert(0, 5)
arr.insert(1, 7)
arr.insert(3, 9)
arr.insert(4, 10)
arr.insert(5, 2)
print("找到", arr.find(2))
arr.delete(6)
arr.print_all()