python 内置数据结构的分析
###List
####List各个操作的复杂程度
显然可以看出,使用list的加法最慢,append更快,而直接用range生成一个list是最快的。
可以看出来pop(0)显著慢于pop( ),这是因为pop(0)的效率是\(O(n)\),而pop( )的效率是\(O(1)\)
Figure 3: Comparing the Performance of pop and pop(0)
###Dictionary
####Dictionary的各个操作的性能
可以看出dictionary的复杂程度几乎都是\(O(1)\)的,这也反映出Dictionary应该与Hash Table很相近,建立dic的过程就是建立映射关系。
####dic和list的对比图
###利用Stack做一个括号检查器
###利用Stack将十进制数转化为二进制
这里通过stack.pop()的方法把最后一个值取出来
之后还有两种数据结构
- Queue,就是先进先出法
- Deque,就是左右两边都可以插入和删除的队列
###Implementing an Unordered List: Linked Lists
Figure 1: Items Not Constrained in Their Physical Placement
图中的数字看起来好像是没有顺序的随意摆放的,但是如果我们把他们连接起来,那他们的相对位置就可以被确定了。
Figure 2: Relative Positions Maintained by Explicit Links
一旦我们知道了第一个值在哪,我们就可以知道第二个值,就可以知道第三个…. 我们需要有一个Head作为开头,同样我们在访问最后一个数的时候,需要知道后面没有数了。
####The Node Class
我们先创建一个Node,包含了自己,还包含了通向下个数的道路。
在Node中,next设置为None就表明后面没有值
Figure 3: A Node Object Contains the Item and a Reference to the Next Node
###The Unordered List
一个没有顺序的list,就应该有一系列的Node来组成,Unordered list应该包含第一个数,head,这样才能找到之后的数字。所以我们可以这样构造Unordered list
我们可以先构造一个unordered list的实例,mylist
>>> mylist = UnorderedList()
这样我们就建立一个如下图的结构
Figure 5: An Empty List
在链表中,Head应该用来refer to链表中的第一个数值。然后第一个Node又可以refer to第二个Node。
就像这样
Figure 6: A Linked List of Integers
先考虑以下的情况
>>> mylist.add(31)
>>> mylist.add(77)
>>> mylist.add(17)
>>> mylist.add(93)
>>> mylist.add(26)
>>> mylist.add(54)
由于31是第一个加入进来的item,所以31应该在整个链表的尾部,而54是最后一个加进来的item,所以54应该在整个链表的首部,连接着Head。
所以我们应该这样设计add函数
Figure 7: Adding a New Node is a Two-Step Process
加入一个新的Node是一个两部的过程,首先要把新的Node连接到之前的链表中的第一个数,并且让head指向这个新的Node。
之后还有size, search, remove三个操作,都很好理解,我就直接贴代码了。
size就是利用getNext()遍历所有的元素,然后统计总和。
search也是利用getNext()遍历所有的元素,找到了就返回True
remove,就是利用search的原理找到要删除的数,然后把前面一个数,和下一个数连接起来。
剩下的就是二叉树了,二叉树乍一看很好了解,但是它的各项操作还是要多点时间去理解的。
但是今天真的不想看了,晚上休息一下,周末可能再抽空看吧。用五章结束python的数据结构应该还算充实了。
过后就是去进入数据挖掘了,先马克一下书籍
building machine learning systems with python
之后要考虑一下要不要学一下Scrapy,可能寒假有空再说吧
comments powered by