【Python数据结构与算法】Array(数组)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Daycym/article/details/84309359

Array(数组)

下图为6个元素 [15, 6, 12, 9, 13, 20] 的数组:

在这里插入图片描述

数组是一个盛有单一类型固定数量值的容器类

  1. 以0开始的索引
  • 数组的元素带编号,编号从0开始,如上图中,元素6的位置1;而元素15的位置为0
  • 元素的位置称为索引,因此,元素6位于索引1处
  1. 数组长度
  • 数组长度为包含的元素个数,len(arr)
  1. 内存表示:连续的
  • 数组在内存中是以连续的空间存储的
  • 假设有个数组[0, 1, 2],它会以连续的空间存在在内存中;如果此时需要添加一个元素3,但是一开始连续的空间后面的位置存储了其他数据,此时就要重新开辟一段连续的空间来存储新的数组,之前的空间会被释放,如下图:

在这里插入图片描述

  1. 边界检查
  • 对于数组,要注意边界的检查,如果操作超过了数组的边界,就会报错
  • 例如:数组arr = [1,2,3],如果访问 arr[3],索引超过了数组长度,会报错

注意:Java和C++等,在访问arr[-1]会报错,但是python中,表示访问最后一个元素

Array 分析

  1. 读取
  • 读取数组中的元素,可以通过数组名加索引来读取
  • 例如:arr[0],arr[1]等,注意:索引是从0开始的
  • 数组的读取操作的时间复杂度是 O(1)
import numpy as np
arr = np.arange(0,10)
print(type(arr))
print(arr[0])
print(arr[1])

由于数组是存储单一类型固定数量的容器
开辟的每个空间大小都是一样,例如存储整型,python默认int32
如果第一个空间是从0开始的,那么下一个空间就是从32开始,以此类推
因此,在执行读取的时候,只需要执行简单的数学运算就可以读取到任何元素,效率很高

  1. 尾部增加删除
  • 在数组尾部增加元素时,时间复杂度为O(n),因为如果原数组的后面的连续空间存储了其他数据,那么就需要重新开辟空间,并把之前的元素复杂过去,即最坏情况下要对所有元素进行操作
  • 在数组尾部删除元素时,时间复杂度为O(1),因为删除元素不管怎样都不要增加空间,而读取操作的时间复杂度是O(1),可以直接删除最后一个元素

在这里插入图片描述

arr = [i for i in range(0,10)]
arr.append(10)
print(arr)
arr.pop()
print(arr)
  1. 中间增加删除
  • 中间增加元素时,时间复杂度为O(n);首先,因为增加元素时,可能没有足够的空间,就需要将整个数组复制到其他地方;其次,在中间增加元素时,我们需要将后面的元素依次往后移。
  • 中间删除元素时,时间复杂度为O(n);因为删除中间元素时,要将后面的元素依次往前移。
    在这里插入图片描述

在中间增加的时候,要先将最后一个元素往后移,然后倒数第二个元素往后移,以此类推,不然,先移动前面的会把后面的元素覆盖掉
在中间删除的时候,要先将删除元素的后一个元素往前移,后面的依次往前移

arr = [i for i in range(0,10)]
arr.insert(3, 4)  # 3表示索引为3的位置,4表示要添加的元素
print(arr)
arr.remove(arr[3])  # 将索引为3的元素删除
print(arr)

时间复杂度

操作 数组
读取 O(1)
插入 O(n)
删除中间 O(n)
删除最后 O(1)

算法练习

  • 求一元二次方程的解
  • 歌唱比赛
  • 计算质数
  • 证明哥德巴赫猜想
  • 打印图形
  • 洗牌

程序见Github:01_Array_数组

猜你喜欢

转载自blog.csdn.net/Daycym/article/details/84309359
今日推荐