1. 程式人生 > >【Python資料結構與演算法】Array(陣列)

【Python資料結構與演算法】Array(陣列)

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_陣列