数组列表:动态数组(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