Python中的数组
我们这个选题将基于python去思考数组类型。
python中内置的数组格式结构,我们经常用到的就是我们的列表,那么,我们就应该先熟悉,列表在底层,对空间的使用,和它的底层实现原理。
list对空间的占用其实非常大,因为其底层的实现原理,其实可以从一个角度去理解这一点,insert通过对值的增加,因为中间插入,不确定下标,也许是最后一个值,直接占满空间,所以需要扩大一倍的空间,当然,对于这个的底层理解,我也没有过多的探究,只是从这个点去进行理解吧,apend和pop的理解也同理。当然,这不是我们今天内容的重点。
了解了python中对数组格式的定义和利用后,我们就可以进一步的利用python去实现我们的数组类型,所以说python适合做算法人工智能,很大的一个优势就在于,它是一门伪代码语言,很容易实现我们所需要的逻辑。
基础实现代码
首先,我们为什么要继承object呢?因为python2中并不会直接继承object,如果这段代码在py2中运行,没有object的继承的话,则会报错,当然,在这里,这不是我们关注的重点,这作为一个了解的知识点学习就行了。
array:数组(翻译中为:大堆)
我们将python中的列表大小在一开始就确定好,这样的话,我们的set操作等,只需要对节点进行修改就可以了,因为我们的大小已经确定了,get也是如此,只需要通过下标去取值。这是我们对python中内置的魔法方法的重写完成的取值,下标赋值的操作。
class Array(object): def __init__(self, size=32): self._size = size self._items = [None]*size def __getitem__(self, index): return self._items[index] def __setitem__(self, key, value): self._items[key] = value def __len__(self): return len(self._items) def clear(self, value=None): for index in self._items: self._items[index] = value def __iter__(self): for i in self._items: yield i
当然,我们如何完成insert等进阶操作的编写呢?以及如何在超出范围的时候保证不会让我们的程序中断呢?下面我们将会对这些操作完成实现。
数组进阶之append
这里,我们通过对最后一个节点的记录,完成对append的编写,我们只需要在最后一次添加值的后面一个节点进行更改,就完成了我们的append,但是这里我们循环,仍然会打印None节点,同时有崩坏程序的危险。
class Array(object): def __init__(self, size=32): self._size = size self._items = [None]*size self._last_node_index = -1 def __getitem__(self, index): return self._items[index] def __setitem__(self, key, value): self._last_node_index = key self._items[key] = value def apend(self,value): self.__setitem__(self._last_node_index,value) def __len__(self): return len(self._items) def clear(self, value=None): for index in self._items: self._items[index] = value def __iter__(self): for i in self._items: yield i
完成了上述代码后,我们只需要进行简单的对None节点的不取用,以及对空间超出时候的动态扩容就可以了。
class Array(object): def __init__(self, size=32): self._size = size self._items = [None]*size self._last_node_index = -1 def __getitem__(self, index): return self._items[index] def __setitem__(self, key, value): if key>self._size: self._size=2*self._size new_item=[None]*self._size for i,v in self._items: new_item[i]=v self._items=new_item self._items[key] = value if key>self._last_node_index: self._last_node_index=key def apend(self,value): self.__setitem__(self._last_node_index+1,value) def __len__(self): return len(self._items) def clear(self, value=None): for index in self._items: self._items[index] = value def __iter__(self): for i in self._items: yield i