01-算法和数据结构-数组

数组

一、什么是数组

数组是一种数据结构,是存放在连续内存中相同类型数据的集合

二、特点

  • 数组的下标是从0开始的

  • 数组的内存空间是连续的

  • 数组存储的是相同类型的数据

三、在python中的数组

在python严格来说没有传统意义上的“数组”这个数据结构,但有几种类似数组的结构可以使用,分别是List、Tuple、ndarray

1、列表(List)

  • 列表是一种内置的可变序列类型,可以存储「任意类型」的对象。

  • 通过方括号[]或者list()方法创建。

  • 列表的大小可以动态变化(可以增加或删除元素)

    # 创建列表
    my_list = [1, 2, 3, "apple", True]
    
    # 访问列表元素
    print(my_list[0])  # 输出:1
    
    # 添加元素
    my_list.append(4)
    print(my_list)  # 输出:[1, 2, 3, "apple", True, 4]
    
    # 删除元素
    my_list.remove("apple")
    print(my_list)  # 输出:[1, 2, 3, True, 4]
    
    
1、python中的列表是如何实现的

python中的list其实是使用动态数(dynamic array)组实现的,其底层在Cpython解释器中是使用c语言实现。但是python中的列表是一个可变序列,可以存储任意类型的对象。

  • 动态数组允许在需要时自动扩展其大小以容纳更多元素。

  • 底层还是使用连续的内存块来存储元素,当列表需要增长时,python会分配一个更大的内存块,并将现有元素复制到新内存块中。

  • 数组创建时会预分配空间,当空间不足时,会重新申请空间,并把数据复制到新申请的空间中,一般情况下列表append是时间复杂度O(1),但是当需要扩容时是O(n)

2、疑问底层是数组实现,为何python中的列表元素可以支持不同类型的数据呢?
  • python是动态类型,变量和数据结构中的元素在运行时被检查类型,而不是在编译时;

  • python对象的类型信息和值是分开的,每个对象存在三要素,id、value、type;

  • 「python列表中存储的是对象的引用,而不是值,这是list支持多类型的关键」

  • python中的所有数据对象都是基于PyObject对象,PyObject包含一个指向类型对象的指针和引用计数。

2、元组(Tuple)

  • 元组是一种内置的不可变序列类型,也可以存储任意类型的对象

  • 元组通过小括号()创建和tuple()创建

  • 元组一旦创建,其内容不能更改

    1、疑问元组和列表有什么区别,为何也可以支持多种类型数据结构?

    元组是不可变类型,一旦创建就不可以修改,列表是可变类型,可以修改元素。

    元组的也是数组实现的,但是是固定大小的数组,和列表一样存储的是元素的引用对象,而不是值,所以也支持多种数据类型的存储

3、NumPy数组(ndarray)

  • NumPy数组是一个强大的多维数组对象,由NumPy库提供,适用于数值计算。

    • NumPy中数据的类型是需要保持一致的,和列表和元组不同

              数组结构  

typedef struct {
    PyObject_HEAD
    char *data;           // 指向数据的指针
    int nd;               // 数组的维度
    npy_intp *dimensions; // 每个维度的大小
    npy_intp *strides;    // 每个维度的步长
    PyObject *base;       // 引用计数,避免内存被释放
    PyArray_Descr *descr; // 数据类型描述
} PyArrayObject;

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值