python數據結構之動態數組


數組列表:動態數組(Array List)

簡介:

最基礎簡單的數據結構、最大的優點就是支持隨機訪問(O(1)),但是增加和刪除操作效率就低一些(平均時間復雜度O(n))

動態數組也稱數組列表,在python中一般為List

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

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

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

1.數組列表的概念:

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

2.數組操作函數:

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

4.用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM