如何实现动态数组

146 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情

作者: 千石
支持:点赞、收藏、评论
欢迎各位在评论区交流

前言

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

一些话

本文内容来自我平时学习的一些积累,如有错误,还请指正

正文

动态数组是指在声明时没有确定数组大小的数组,即忽略方括号中的下标;当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小。动态数组是容量可以变化的数组,它支持普通数组支持的所有操作,并额外支持扩容操作。

动态数组与静态数组相比,具有更大的灵活性和可扩展性。

Python可以通过内置函数或自定义类实现动态数组。 内置函数包括append()、extend()、insert()等。 自定义类需要实现数组的基本操作,如增删改查等。 由于Python的内存管理机制,Python中的列表已经是动态数组了,因此不需要手动实现动态数组。

代码实现

class DynamicArray:
    def __init__(self):
        self.array = []
        self.capacity = 0
        self.length = 0
    def append(self, value):
        if self.length == self.capacity:
            new_capacity = max(1, 2 * self.capacity)
            new_array = [None] * new_capacity
            for i in range(self.length):
                new_array[i] = self.array[i]
            self.array = new_arrayself.capacity = new_capacity
            self.array[self.length] = value
            self.length += 1
    def __getitem__(self, index):
        if index < 0 or index >= self.length:
            raise IndexError("Index out of range")
            return self.array[index]
    def __setitem__(self, index, value):
        if index < 0 or index >= self.length:
            raise IndexError

优缺点

优点:

  • 可以动态定义数组大小,而静态数组的大小是固定的

  • 在堆空间,理论上内存越大就可以申请越大的数组

  • 不需要考虑溢出问题

缺点:

  • 和链表相比,链表可以适应数据动态增减的情况,方便插入、删除数据项

  • 静态分配是在编译时完成的,当你知道数组大小时使用;而动态分配按需分配内存,没有额外成本