自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 图的存储表示

图不是一个递归结构的数据结构,也就没法给出一个递归定义,图的定义可以用一个三元组来表示:顶点集、弧/边集、操作集,在图的图形表示里,顶点用一个小圆圈表示,弧用一条有向边来表示,若图中存在一条顶点v到顶点w的弧,由v引一条指向w的弧来表示,v为弧的弧尾,w为弧的弧头。图分为有向图和无向图,无向图是有向图的一种特例,它是一种具有对称性质的有向图,也就是如果从顶点v到顶点w存在一条弧,那么从顶点w到顶点v也必存在一条弧,也就是顶v和顶点w之间存在两条有向边,为了简化表示,用一条连接顶点v、w的无向边表示。

2024-06-12 14:40:25 484

原创 多叉树和二叉树的互转及多叉树森林和二叉树的互转

二叉树结点采用孩子兄弟链结构存储,把多叉树的第一棵子树转换的二叉树作为二叉树根的第一个孩子,把多叉树的第二棵子树转换的二叉树作为二叉树的第一个孩子的兄弟,把多叉树的第三棵子树作为其第二棵子树转换的二叉树的兄弟,以此类推。把二叉树的第一棵子树转换成的多叉树作为多叉树根的第一棵子树,把二叉树第一棵子树的兄弟树转换成的多叉树作为多叉树的第二棵子树,依次类推。把森林中的每一棵多叉树转换为一棵二叉树,然后把这些二叉树以兄弟链的形式结合在一起即得。把二叉树沿着兄弟链拆成一个二叉树集合,把每一个二叉树转换成多叉树即得。

2024-05-24 08:53:29 517

原创 树的线索化

中序遍历二叉树,设置prev指向前一个访问的结点,curr指向当前访问的结点,若prev结点没有右孩子,则设置它的righttag为1,并让rightchild为curr,表示prev结点的后继为curr,若curr结点没有左孩子,则设置它的lefttag为1,并让leftchild为prev,表示curr结点的前驱为prev。像上面所说,二叉树的分支要么指向它的孩子,要么指向它在遍历中的前驱/后继,为了加以区分,需要给二叉树的结点增加一个flag来指示分支是指向它的孩子还是它在遍历中的前驱/后继。

2024-05-21 09:46:05 401

原创 树的序列化

在python里面有个模块pickle专门实施对对像的序列化,序列化之后得到的是一个二进制的字节流,当然我们可以用它来对树这种数据结构来进行序列化,不过如果树的结点的value是字符串,那么可以对树进行一个轻量级的序列化,这里来讲讲这个。

2024-05-16 16:15:09 491

原创 矩阵的压缩存储

cin2(Q的第i行)的值的一部分,可以预设一个初始值为0的数组larr来存放Q的一行的各个矩阵元的值,序列中的项aij * bjk加到larr[k]中(larr[k] += aij * bjk),我们按照列号从小到大的顺序依次让M中第i行的元aij和N的第j行进行上面的相乘处理,最后就能得到Q的第i行,我们按照行号从小到大的顺序依次对M的行执行上述的操作,便能按照行号从小到大的顺序依次得到Q的各行,也就能得到完整的Q了。拿M的第i行和N的所有列去相乘,要得到Q,怎么做呢。

2024-05-07 13:48:17 948

原创 python实现2路归并排序

对于一个序列a1 a2 a2 …an,我们让a1和a2合并,a3和a4合并,依次类推,最后得到一个有序子序列的序列a1 a2;an-1 an,接下来让a1 a2和a3 a4合并,a5 a6和a7 a8合并,以此类推,得到一个更大有序子序列的序列a1 a2 a3 a4;算法实现的难点和需要注意的地方在于边界情形,子序列两两配对的时候,可能最后有一个子序列落单了,找不到另一个子序列了,还有两个子序列进行合并时,我们交替得把两个序列的切片首尾接在一起,要注意最后一个切片的处理。

2024-05-04 10:50:24 543 1

原创 python实现的堆排序

先来看怎么解决问题(2),假设堆顶元素取序列中的最小值,根据堆的定义,堆的任一子堆还是堆,假设输出堆顶元素之后,把数组当中最后一个元素ak放到了堆顶位置(取数组最后一个元素不会破坏左右子堆的堆性),原堆的左右子堆的堆顶元素是分别ai和aj,那么ai、aj、ak三者之中最小值将成为新堆的堆顶,如果是ai,则ak和ai换位,如果是aj,则ak和aj换位,如果ak仍然是最小的,什么都不用做,调整结束。数组下标从0开始,如果我们把ai存放到数组下标为i-1的位置,那么ai的子结点的数组下标是2i+1和2i+2。

2024-05-03 20:36:08 763 2

原创 python实现的冒泡、快速排序

ai是满足最大值在最右边的序列,求a1 a2…ai ai+1满足最大值在最右边的序列,若ai

2024-05-01 18:33:26 1181

原创 python实现的基于单向循环链表插入排序

相比于 中定义一个循环双向链表来实现插入排序来说,下面的实现采用一个单向循环链表来实现,并且不需要定义一个单向循环链表类,而是把一个list(数组/顺序表)当成单向循环链表来用,list的元素是一个包含两个元素的对象,一个是数值,一个是指向下一个list元素的指针(list的元素下标),list的第一个元素(下标为0的元素)是单链表的头结点,它不存放数据,起到哨兵的作用。第一种,可以new一个空的list,遍历链表,依次把访问到的元素append到list中,最后返回这个list。有两种方式来实现这一点。

2024-04-30 15:10:46 745 1

原创 python中什么样的数据类型是可散列的?

像其他的可变collection类型,如列表、集合和字典都是不可散列的,因为这些对象它们的内部状态是不稳定的,它们容纳的数据元素的数目是可动态变化的,哪怕它的数据元素都是可散列的,如果根据它们的数据元素来计算它们的hash值,不同状态下,它们的散列值可能是不同的,我们希望一个对象它在的整个生命周期内它的散列值是不变的。如果一个对象是可散列的,那么这个对象在它的生命周期内,它的散列值是不变的 ,而且这个对象需要实现__hash__方法,另外还要有__eq__方法,这样才能跟其他键比较。

2024-04-28 16:01:10 408 1

原创 python实现的折半插入排序

这可以通过归纳总结出来,折半查找的过程其实就是在不断缩小待插入数据应该被插入的范围,这个范围记为[low, high],当这个范围缩小到1的时候,也就是low等于high,再缩小就没法缩小了,这个时候mid等于low和high,待插入的数据,当它比source[mid]小,那么待插入数据应该插在mid的位置,mid及后面的数据应该后移,根据逻辑执行了high = mid - 1之后跳出循环,所以跳出循环之后待插入数据应该插在mid位置也就是high + 1位置。

2024-04-28 14:25:20 301

原创 python实现插入排序

基于循环双向链表实现的插入排序,循环双向链表见前作。

2024-04-27 18:18:38 397 2

原创 python实现的循环双向链表

【代码】python实现的循环双向链表。

2024-04-27 16:50:48 319 2

原创 python中的元类

上面说了类是类的实例的模板,所以你看类的__new__被定义为一个绑定的类方法,类本身是作为方法的第一个参数,一般命名为cls,一般情况下,__new__不需要其他的参数,__new__根据cls来产生一个实例,__new__返回产生的实例,也有tuple等少数例外__new__需要额外的参数,绝大多数情况是不需要的。正如类是类的实例的工厂,元类则是类的工厂。不过这两种关系还是有所不同,类是类的实例的模版,但元类不是类的模版,元类更像一个纯粹的类的组装工厂。

2024-04-25 18:15:23 949 1

原创 python中的抽象类

抽象类是抽象层次上的对象类型的一个定义,该对象类型往往是由许多具体的对象类型提取共性而得到的一个概念,它预定义了一些属性和方法(状态和行为),其中一些方法没有给出实现(抽象方法),而必须由子类来实现,这样的类就是抽象类。python2.x里没有语法特性意义上的抽象类,也就是没有抽象方法,也不存在类不能被实例化,但逻辑意义上的抽象类很普遍,比如我们定义一个类,里面有几个方法没有给出具体实现(你直接实例化它什么也干不了),然后需要定义子类对其进行实现,这个类其实就是抽象类。python中的抽象类。

2024-04-25 09:41:58 618 1

原创 python中一个类是另一个类的子类的三种情形

注册一个类为另一个类的虚拟子类,通过调用另一个类的register方法,check的时候issubclass调用另一个类的__subclasscheck__,里面的逻辑一目了然,有兴趣的读者可以自行阅读。指定一个类是另一个类的虚拟子类,通过调用另一个类的类方法register,这个方法在类的元类ABCMeta里面定义,也就是要求另一个类必须指定它的元类是ABCMeta才行。举例来说明,类Sized实现了一个特殊方法__len__,我们定义一个类B,它也实现了__len__,那么类B是类Sized的子类。

2024-04-24 17:32:16 1172 1

原创 python的对象层次结构的树图展示

基类attrs用来记录树的一个结点的一些特征,它的name属性将被打印到树的图形中,它代表树的一个结点,它的firstchld属性表示自己是否是父结点的第一个孩子,它的lastchld属性表示自己是否是父结点的最后一个孩子,它的allchlddrawed属性表示自己的孩子结点是否已经全部绘制完毕。这里修改了一下,实现了一个基类,实现了一个子类用以打印类的继承关系图,供大家参考。要实现其他的树对象的打印,只需要同样实现基类treemap和attrs的子类,对上面的代码稍做修改就可以。

2024-04-18 12:52:26 745 1

原创 python中的异常和traceback

python里的异常是一个对象,和其他的对象一样,没有什么特殊之处,不过异常对象是用来表示程序中的错误的,所以它往往带有一些表示程序的错误信息,python中的异常,有的是解释器在执行指令的时候检查出来而抛出的,有的是程序里异常流程raise出来的,还有是语言语句本身抛出来的,像生成器终止时候抛出来一个StopIteration异常,程序里可以使用try/except/finally语句来捕获处理。traceback对象从何处获得呢?调用sys.exc_info()可得,下面给出一个简单的例子。

2024-04-17 17:18:37 985

原创 彻底理解异步生成器

python 3.5之后,以async def定义的函数是协程函数,调用它生成的协程被称之为native coroutine,在之前都是把生成器函数装饰一下得到一个协程函数,调用它生成的协程是旧式协程,当然生成器、旧式协程和native coroutine本质都一样,但是当我们说到生成器和协程的时候,侧重的是它们的使用场景的不同,生成器侧重的是迭代式得产出一个个值,生成器就像个producer,调用生成器的是consumer,而协程是作为一个轻量级的线程来使用在异步编程领域,所以有必要把它们区分开来。

2024-04-17 15:38:39 1027

原创 关于yield from的深度剖析二

谈一下yield from递归,它看起来不像普通函数递归那么直观,如果我们把调用过程用一棵树来表示,得到一棵调用树,yield from调用作为中间结点(非叶结点),yield语句是访问结点的动作,执行生成器yield from语句就是由一个结点下降它的一个子结点上,执行生成器的return语句或者后根遍历执行完yield语句,就是由一个结点回溯到它的父结点,所以基于yield from实现树的遍历就很方便了。下面给出一个基于yield from实现的遍历访问UserList类型树的算法。

2024-04-16 11:00:26 277

原创 关于yield from的深度剖析一

yield from并不是被设计用来充当一个数据的流动通道,那只是它的表征而非实质,以我的理解yield from设计初衷是用于把一些基础的功能(生成器代码)组合起来以实现更复杂的功能(生成器代码),yield from表达式的内部逻辑是以一个循环来调用尽子生成器,以捕获一个StopIteration异常为结束,并以StopIteration的value属性为表达式的结果。2)可以实现一个委托生成器(带yield from的生成器),委托生成器在它的调用者和子生成器之间充当一个管道/桥梁。

2024-04-15 15:21:48 506 1

原创 谈谈python里的协程

任意的两个协程coroutine a和coroutine b,如果coroutine a不是由coroutine b交换而来,它可能是第一个执行的coroutine,也可能是由另一个coroutine c交换而来,我们把coroutine a交换到coroutine b定义为ENTER,如果coroutine a是由coroutine b交换而来,那么coroutine a再交换到coroutine b,我们把它定义为YIELD。普遍上的定义是说协程是用户空间的线程,也叫纤程,轻量级的线程。

2024-04-14 18:10:33 380 2

原创 关于装饰器、生成器的一些心得

执行的结果是”call f”被多次打印了,原本我的预期是只打印一次,为什么会打印多次呢,按照fib的定义,它递归调用它自己,可是被装饰之后,它递归调用的不再是它自己了,而是inner,因为装饰之后fib被绑定到inner上了。使用装饰器,记住上面的两句话,就足矣,记住,解释器用装饰器装饰一个对象就做了两件事情,首先调用装饰器,作用于它要装饰器的对象,然后把它装饰的对象被绑定的名字绑定到装饰器返回的对象上,就这点事情,没有其他。2)throw一个异常进去,生成器没有捕获异常,生成器终止,异常被抛回来。

2024-04-12 19:54:11 732

原创 你有多了解python里的函数?

如果是一个整数,得先得从函数的code object的co_varnames/co_names/co_freevars中以这个整数为index去取得变量名,然后再到对应的namespace中取得对象,如果参数直接是变量名,不是省了一步吗,问题在哪呢,问题在于变量名是个字符串,它的长度是任意的,如果opcode的参数可以是字符串,那么字节码的长度是不固定的,不同opcode的字节码长度可能不同,相同opcode的字节码,因为参数的长度它们的长度也可能不同,解释器拿到一个字节码序列的时候如何去划分指令的边界?

2024-04-11 18:41:45 1491

原创 python中的可执行/调用对象有哪些?

看类x的code object里的字节码,它的逻辑也就是把类的__module__、__qualname__、__init__、f等属性对象装入到一个namespace中,可见执行一个类,生成一个类对象,它首先就是在做一个打包工作,把类体里面定义的各个对象打包到一个字典里面,了解元编程的朋友知道,后续python解释器会把它作为参数传入元类的构造函数里,元类调用之后返回那个类对象。大家首先想到的是函数/方法,但除了函数/方法之外,还有其他的对象是可执行/调用的,大家都了解吗?本文将揭开它们的面纱。

2024-04-03 13:50:47 598 1

原创 python中何时使用闭包?

作为一个pythoner,闭包大家都很熟悉,但何时使用闭包?

2024-04-02 16:29:19 806 1

原创 打印目录树

来说一下这个程序的设计思路,要打印目录树,必然离不了对目录树的遍历操作,这里采用后根遍历来访问目录树,一边访问各级目录,一边进行目录树的绘制,绘制图形的时候按行进行绘制。程序的难点在于按行进行绘制,如上图所见,图的一行里除了有目录名称和表示树的分支的--和|-之外,还有大量的空白和单一的|以及换行,为了完成工作,我们需要记住由根目录(树的根结点)到当前访问到的目录(树的结点)的路径,依次访问路径上的结点,进行图的行的绘制。作者是参考进程树的输出样式来设计的目录树的输出样式。

2024-04-02 12:49:54 535 2

原创 正整数拆分问题

下面让我们来研究一下如何拆分一个正整数,举例来说,对3进行拆分,很容易给出所有拆分的情形,3=1+1+1,3=1+2,3=2+1,3=3,为了简化输出,我们把3=1+2和3=2+1看成同一种拆分,我们以3=1+2代表了,也就是设定拆分序列为正序。你可能会疑惑,很重要吗?好像不很重要,因为似乎没啥实际的用处,无论是学习还是工作,没有遇到过这种需求,但其实它非常重要,如果你曾经遇到过一个问题,n个结点的树,它有多少种形态,这个问题数据结构与算法的书里有答案,但如果要你画出所有树的形态,你画得出来吗?

2024-03-30 17:10:39 404

原创 输出所有的排列组合

需要注意的是前面步骤挑出的数在后面不能再出现,也就是要记住前面步骤里已经挑选的数,还要注意的是当输出了一个排列,要计算下一个排列的时候,并不是又要从第一个数重新开始挑,而是采用回溯法,从最后一个数开始,为它挑一个新数,如果还可以挑出一个新的数,挑出那个数,前面的数保留不变,输出排列,如果不能再挑出一个新数,则回退到倒数第二个数,为倒数第二个数挑出一个新的数,然后挑最后一个数,输出排列,如果不能为倒数第二个数挑一个新数,则回退到倒数第三个数,以此类推,下面看代码实现。这是排列的情形,那么组合呢?

2024-03-30 15:34:16 402

原创 一个四则运算器的实现

python实现的四则运算计算器

2024-03-29 11:51:23 443

原创 霍夫曼树为什么是最优二叉树?

霍夫曼树之所以是最优二叉树的归纳原理

2024-03-28 13:45:46 815 1

linux平台下查看目录结构的小工具

linux平台下查看目录结构的小工具,python语言实现,使用方法: python dirmap.py 目录路径,可以是绝对路径,也可以是相对路径

2024-04-02

python实现的四则运算计算器

python实现的一个四则运算计算器,输入运算表达式,输出结果,支持带符号数,支持输入括号。

2024-03-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除