
数据结构
文章平均质量分 67
用python实现各种的数据结构
筱羊冰冰
这个作者很懒,什么都没留下…
展开
-
python内置库——heapq(实现小顶堆)
官网地址:heapq — 堆队列算法特点堆本身还是一个树结构,通常还是使用数组进行存储,方便操作。我们找到py有一个基本语法是数组下标从零开始,py中的堆也是这样实现的,问题就是使得父子关系不那么直观。C++中的堆是大顶堆(大根堆),一般也是常用的一种堆,但是py中还是选择了实现一个小顶堆。内置方法创建堆:如果是用过counter的,可能感觉上是差不多的,就是对一个可迭代序列调用方法即可heapify(iterable)不过官方文档上的介绍,这个实现是原地的,并且是在线性时间内调整成堆原创 2021-09-03 10:30:02 · 2582 阅读 · 0 评论 -
python——哈希复习(构建哈希表&字典常规操作讲解)
小白的hash复习计划先上传一下相关资源吧,直接丢百度网盘了。一份字典的操作整理,一份md文档,和下面的相同还有一份是python数据结构黑书。准备是看一下python数据结构,黑书yyds第十章讲的是哈希表,结构:讲解了py中字典的一些行为,参见dic_use.py(下面第二个大标题)用list装了一个键值对的类,实现了一个collision库的有序字典(其实就是没哈希的)哈希知识复习根据MapBase基类实现了一个自己的哈希表(建议自己跟着书上码一遍,线性探测这种的实现原创 2021-08-03 11:36:59 · 489 阅读 · 2 评论 -
python数据结构——二叉排序(搜索)树
概念二叉排序树很重要的性质就是左子树的内容 小于 根节点 小于 右子树,并且具有递归的性质,也就是每一个子树都满足。按照这个顺序,我们难免想到中序遍历,因为中序遍历就是左中右的顺序,使得我们的遍历结果为已排序序列。这里不提中序遍历,如果有问题看这里。(C代码,稍微改一下就行)我们提一下寻找一个结点p的上一个结点和下一个结点的方式(如果没有返回None)。上一个结点按照左中右的顺序,如果有左子树,那上一个结点一定在左子树中。那么应该是哪一个呢? 是左子树遍历的最后一个结点,也就是左子树的最右结点原创 2021-06-13 08:20:15 · 309 阅读 · 0 评论 -
python数据结构——实现自己的有序字典
有序字典我们之前讲过字典,并且尝试过用非排序列表和哈希表实现字典。那么什么是有序字典呢?就是字典中的key按照顺序排布。和collections中的有序字典还不一样,那个是保存了用户添加key-value对的顺序。实现这里我们采用一个列表来存储。因为是有序列表,所以我们用二分法来进行查找,进而实现插入和删除、修改。代码:from collections import MutableMappingclass MapBase(MutableMapping): """lightweig原创 2021-06-11 14:48:17 · 445 阅读 · 0 评论 -
python数据结构——利用堆实现优先级队列
之前写过一个有序/无序列表来实现优先级队列的,在这里。这次,我们尝试一下用堆来实现。堆首先的话,这里默认的堆是小顶堆。堆,是二叉树的一种,更准确来说是完全二叉树,所以经常使用数组(python中用列表)来存储。如果对这一部分有问题,建议看这里。堆的性质就是根部的结点最小(这里默认小顶堆),因为树的递归性质,对于每一个子树都成立。堆支持插入和删除,一般删除都是指删除根节点,并且认为在操作之前堆是满足性质的。插入我们习惯的是先在列表的最后进行插入,然后此时一般会破坏堆的性质,我们就需要进行整理。原创 2021-06-08 08:54:34 · 427 阅读 · 2 评论 -
python数据结构——哈希实现字典(map)
前言上一篇我们尝试使用未排序列表实现了字典,懂的都懂确实效果不好。这次我们来尝试一下使用哈希表来做,那么就先复习一下哈希的内容吧实现我们的字典,需要先import两个东西from collections import MutableMappingfrom random import randrange第一个是我们字典的基类,第二个是方便生成随机数class MapBase(MutableMapping): """lightweight composite to store ke原创 2021-06-09 08:32:59 · 828 阅读 · 0 评论 -
python&数据结构——未排序列表实现字典(map)
map,不完全是字典map的本意是映射,一个key-value对的映射。字典属于其中的一个,但平常见得多的主要还是字典,所以下面就直接上字典了。这里的话,我们是先提供了一个基本的结点,包含了key、value,然后重构了等于、不等于运算符(注意等于不等于运算符的内容是不同的,一个是key,一个是整体)等,主要的结构还是基于列表。其实字典最香的还是哈希实现的O(1)查找,列表做不到,但是实现一下加深理解,下一篇我们来一个哈希。from collections import MutableMappin原创 2021-06-07 12:14:37 · 321 阅读 · 0 评论 -
python数据结构——优先级队列
前言这里,我们的优先级队列是涉及到了一个key-value对的。组合设计模式原创 2021-06-02 08:41:53 · 572 阅读 · 0 评论 -
python数据结构——基于双向链表的位置列表类
双向链表这里直接给出代码,有问题的看这里。class _DoublyLinkedBase(): """a base class poviding a boubly linked list representation""" class _Node(): __slots__ = '_element','_prev','_next' def __init__(self,element,prev,next): self._element原创 2021-05-26 08:33:03 · 327 阅读 · 0 评论 -
python数据结构——用链表实现栈、队列、循环队列、双向队列
前言先复习一下几种数据结构吧。链表,就是一个个结点,用指针的方式来连接起来,因为py的语言特点,我们只需要将next赋值为下一个对象的变量名即可。(变量名本身就可以理解成一个指针索引)如果链表还有问题,看这里。队列和栈,前两天用list实现了一个,在这里,也有讲解。一个是first in first out,另一个是first in last out。双向队列,就是两端都能插入删除的队列,这个的实现需要双向链表。循环队列,之前是list实现的,这里我们用一次node,结构基于循环链表。双向链原创 2021-05-29 09:45:41 · 893 阅读 · 0 评论 -
python数据结构——利用列表实现栈和队列
前言栈和队列的内容,这里就不多说了,还有不清楚的看一下这里。其实list能实现的要比我们定义的栈和队列多很多功能,但是我们还是要实现一个。这里采用的duck typing,也就是你看到一只鸟,跑起来像鸭子,飞起来像鸭子,叫起来像鸭子,那么他就是一个鸭子实现先上代码吧。事先说明:这里有一个empty异常,但是我并没有定义这个类,这个需要继承Exception,这里就不实现了,感兴趣的自己看一下吧栈:"""list实现的栈"""class ArrayStack(): def __原创 2021-05-22 20:12:42 · 780 阅读 · 0 评论 -
python数据结构——基于ctypes生成的动态数组
什么是动态数组详细的看一下这里,动态数组最重要的其实对于当前已有的元素个数调整数组的大小。说明白一点其实就是当元素个数装满了,将数组的大小扩大到2n;当元素个数小于1/4n,将数组的大小调整到n/2。其中调增的方式就是整体移动,虽然看着代价很大,但是平摊下来其实还是O(n),这部分的证明在上面的链接中。实现"""动态数组类,基于ctypes"""import ctypesclass DynamicArray: def __init__(self): self._n = 0原创 2021-05-22 08:02:29 · 465 阅读 · 0 评论 -
python数据结构——实现自己的range类
先看一下range的几个例子range(fir,last)range(last)range(first,last,step)range(5,3,-1)range,最多传入三个参数,分别为开始、结束以及步长,返回一个[fir,last)区间内按照步长取值形成的迭代器(python2中返回列表,后面为了节省空间在python3中改了)比如range(2,6,2),返回[2,4]序列。如果step为负数,那么应当有fir>last,如range(8,4,-2)返回[8,6]我们可以省略st原创 2021-05-20 17:26:52 · 469 阅读 · 0 评论