1. 程式人生 > >Array List (動態數組)的內置函數

Array List (動態數組)的內置函數

self. city 元素 dynamic AS for cit found spa

簡介:

由於Python包裝好了很多算法上的現成的數組操作函數,通過學習對其內部進行進一步的了解;

下面我對內置函數進行整理學習寫下學習筆記:

  • 動態數組(數組列表)的概念
  • 數組操作函數
  • 數組內置函數方法的時間復雜度
  • 把內置函數的內部實現方法用python去實現

數組列表的概念:

  • 順序存儲數據
  • 連續存儲
  • 任意順序訪問,可變大小的列表數據結構允許增加、刪除元素

數組操作函數:

技術分享圖片

數組內置操作函數的時間復雜度:

技術分享圖片

技術分享圖片

用python實現內置函數的方法:

#函數上會標明該方法的時間復雜度
#動態數組的類

class DynamicArray:
    
    def __init__ (self):
        
Create an empty array. self._n = 0 #size self._capacity = 10 #先給個10 self._A = self._make_array(self._capacity) def __len__ (self): return self._n def is_empty(self): return self._n == 0 # O(1) def __getitem__ (self, k):
if not 0 <= k < self._n: raise ValueError(invalid index) return self._A[k] # O(1) def append(self, obj): if self._n == self._capacity: #首先要判斷該容器是否放得下 self._resize(2 * self._capacity) self._A[self._n] = obj self._n
+= 1 def _make_array(self, c): return (c * ctypes.py_object)( ) def _resize(self, c): B = self._make_array(c) for k in range(self._n): B[k] = self._A[k] self._A = B self._capacity = c # O(n) def insert(self, k, value): if self._n == self._capacity: self._resize(2 * self._capacity) for j in range(self._n, k, -1): #從後往前一個一個往後移 self._A[j] = self._A[j-1] self._A[k] = value self._n += 1 # O(n) def remove(self, value): for k in range(self._n): if self._A[k] == value: #一個個查value for j in range(k, self._n - 1): self._A[j] = self._A[j+1] ##再一個個移上來 self._A[self._n - 1] = None self._n -= 1 return raise ValueError( value not found ) def _print(self): for i in range(self._n): print(self._A[i], end = ) print() mylist = DynamicArray() print (size was: , str(len(mylist))) mylist.append(10) mylist.append(20) mylist.append(30) mylist.insert(0, 0) mylist.insert(1, 5) mylist.insert(3, 15) mylist._print() mylist.remove(20) mylist._print() print (size is: , str(len(mylist))) #輸出結果 size was: 0 0 5 10 15 20 30 0 5 10 15 30 size is: 5

Array List (動態數組)的內置函數