Python数据结构——array
array 數組
array是什么
一般來說,array基本是所有程序語言都有的一種基礎線性結構,元素以特定的順序存儲在一段連續的內存中。
在Python中其實也有array這種數據結構,和其他語言的array一樣,也是內存連續,只能存儲相同類型元素的線性數據結構,而且Python的array只能存儲數值和字符。
array有哪些功能
這里只講一下內置array。需要先import array:
# 可以直接使用內置arrayfrom array import array# 或是從numpy中引用arrayimport numpy as npnp.array()array的創建
# 構造方法如下# 需要提供一個類型代碼字符來指示存儲何種元素# 以及一個可迭代對象來填充元素array.array(typecode[, initializer])# array所有的類型代碼字符print(array.typecodes)bBuhHiIlLqQfd# 創建一個存儲整型的arrayarr = array('i', [1,2,3,4,5,6])array類型代碼
從Python類型來看,只能存儲整數,浮點數和unicode字符
并且在Python中,最小的整型size為28個字節,整型的長度可變, 每增加2302^{30}230就增加4個字節。這點以后再補充。
array的方法和操作
這里暫且只談一下數據結構比較基本的增刪改查等操作, 更多代碼詳情見github
具體實現可參考此處
索引
下標索引
所有語言的array都可以通過下標來直接訪問對象。
這一點是由計算機的硬件實現的。我們知道array的元素在內存上的分布是連續的,而且元素種類相同,所以數組中任意一項的地址可以由基本地址和偏移量算出。基本地址就是第一個元素的地址,偏移量就等于索引乘以數組內任意元素占用的內存大小。
時間復雜度:
因為每一次找到對應的元素只需要一次計算,所以索引的時間復雜度為O(1)O(1)O(1)
切片索引
array通過下表索引固然很方便,但有時我們想一次性獲取更多的內容,此時可以使用切片索引。
array[i1:i2]可以返回一個新的數組,包含原數組索引為i1到i2-1的全部元素
時間復雜度:
切片索引的實際操作為:
def slice(i1, i2):res_arr = array(typecode) # 先創建一個新的數組for i in range(i1, i2): # 然后按照索引依次讀取原數組中的元素val = arr[i] res_arr.append(val) # 將這些元素添加到新的數組中return res_arr因此切片索引的時間復雜度為O(2k)?O(k)O(2k) \Rightarrow O(k)O(2k)?O(k),kkk指的是參數的數量
增加元素
append()
array.append(x)可以直接在數組的末尾添加新元素
時間復雜度:
要想增加元素,我們必須先定位到最后一位元素的后一位,然后執行賦值操作
所以索引到最后一個元素和增加一個元素都只需要一次運算,時間復雜度為O(1)O(1)O(1)
insert()
insert(i, x)可以用來在索引i處添加元素x
時間復雜度:
要想在索引i插入某個元素,我們必須先將索引i及之后的元素向后移動一位,然后再給索引i賦值
因此插入元素時需要的后移操作的次數和數組內元素的個數有關,所以時間復雜度為O(n)O(n)O(n)
extend()
extend(iterable)操作將一個可迭代對象的每一個元素添加到數組末尾,如果數據類型和數組的數據類型不匹配會有TypeError異常
時間復雜度:
操作過程為先遍歷讀取可迭代對象的每個元素,然后添加到數組末尾,時間復雜度為O(k)O(k)O(k)
刪除元素
pop()
pop(i=-1)用來移除數組中的某個元素并返回,可以傳入索引值,默認為-1。也就是說pop()默認移除最后一位元素。
時間復雜度:
如果只是移除最后一位元素,那么時間復雜度為O(1)O(1)O(1)
如果移除的是數組中的元素,那么還需要進行數據前移,前移的次數也和數組大小有關,因此時間復雜度為O(n)O(n)O(n)
remove()
remove(x)操作可以移除x元素在數組中的第一個匹配項
時間復雜度:
remove(x)操作可以視為先查找再移除最后數據前移,而查找和數據前移都和數組的大小有關,所以時間復雜度為O(n)O(n)O(n)。但實際使用上,remove()的操作效率較低,因為同時執行了查找和數據前移操作。
修改元素
array的元素修改直接通過索引完成
時間復雜度:
如果是下標索引,時間復雜度為O(1)O(1)O(1)
如果是切片索引,時間復雜度為O(k)O(k)O(k),可看成下標索引重復kkk次
查找元素
index()
index(x)操作可以返回元素x第一次出現的索引值,如果沒找到會出現ValueError異常
時間復雜度:
為了查找特定元素,我們需要遍歷數組,所以時間復雜度為O(n)O(n)O(n)
count()
count(x)操作可返回元素x在數組中出現的次數
時間復雜度:
同樣的,需要遍歷整個數組才能得到結果,所以時間復雜度為O(n)O(n)O(n)
array的優點和缺點
優點
缺點
3. 元素類型限制:使用時必須要限制元素類型
4. 不利于數據修改:插入和刪除操作需要移動一系列元素。
相關章節
Python數據結構——array
Python數據結構——list
Python數據結構——tuple
總結
以上是生活随笔為你收集整理的Python数据结构——array的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法与数据结构(归并排序)
- 下一篇: Python数据结构——list