python实现数组(数据结构与算法之美)

文章介绍了数组作为一种基础数据结构,其在编程中的特性,包括随机访问的高效性以及插入和删除操作的时间复杂度。通过Python代码实现了一个简单的数组类,包含插入、删除、查找和打印操作,强调了Python列表在实现数组概念时的运用,以及在操作中需要注意的边界条件和时间复杂度问题。
摘要由CSDN通过智能技术生成

        在编程语言中,数组不仅是一种基本的数据类型,也是一种基础的数据结构,它用于存储相同类型的数据,支持随机访问,时间复杂度为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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NangoGreen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值