数据结构与算法(python实现)
killeri
Python的自学者,时间很宝贵,我选择Python
展开
-
递归结合左式堆的一个具体说明!
关于递归的一点说明,今天看到左式堆合并操作时对递归突然有了很好的理解,就结合《数据结构和算法分析》第一章的关于递归的说明,好好理解了下递归(如何使用递归)当然,有些话是引用书本的首先我们来说一下递归的四条基本法则(下面会结合例子说明的):重点内容 一、基准情形:在递归实现中一定要有某些基准情形,它无需递归就可以实现。 二、不断推进:对于那些需要用递原创 2017-11-12 18:00:29 · 315 阅读 · 0 评论 -
josephus环的实现(顺序表和链接表)
josephus环问题是数据结构中一个常见的实例:假设有n个人做成一圈,现在要求从第k个人开始报数,报道m的人退出。然后从下一个人继续从头报数,并按相同的规则退出, 直到所有的退出。还有就是要按退出的顺序打印出出列人的编号。其实看到这个“一圈”,我第一瞬间就想到了用循环链表,也确实可以。这里我分别中顺序表和循环链表进行了实现。一、顺序表:对于顺序表对josephus问题的实现由两种思路:第...原创 2018-10-04 13:05:19 · 689 阅读 · 0 评论 -
链表的总结
一个链表实质上是链表对象和链表实体 的组合,如图:图中的first,就是一个链表对象,它代表这个链表,它本身也是一个结构,当它只用来指代第一个节点本身的时候,它可以是一个值为第一个节点引用的变量,当然我们可以为它定义一个结构,使其存储链表的长度等信息,如class listObj: def __init__(self): self.node_num = 0 self.head = ...原创 2018-09-27 12:03:09 · 280 阅读 · 0 评论 -
python实现一个大学的人员管理系统
python作为一个面对对象的程序设计语言,实现一个人员管理系统有自己关于类的方法。首先,通过定义一个人员的类对象,实现对于人员公共特性的支持,公共的特性包括:姓名,性别,出生日期等,用一个Person类来表示。大学里总的来说分为两种身份的人:学生(Student)和职工(Staff),这两种有自己的特性,比如学生信息就有学号,课程,成绩等;职工有职工号,职位,薪水等。利用python类对象的...原创 2018-09-22 19:43:50 · 6219 阅读 · 0 评论 -
栈的应用之判断文本括号是否正确
栈的一个经典应用就是判断一个文本中的括号,包括小括号,中括号,大括号是不是有缺失,顺序不正确等情况。栈的类的实现在前面文章中已经实现,我们这里直接应用(用的是顺序表实现的栈)两种解法:第二种解法有细节第一种解答法如下:# _*_ coding:utf-8 _*_"""用于检查文本中的括号是不是使用正确,对于文本中括号的缺少等问题都能够检测"""from 栈的顺序表实现 im...原创 2018-10-12 19:11:18 · 311 阅读 · 0 评论 -
python字符串以及他的匹配算法
对于python字符串的实现来说,它本身是一个线性表,根据前面我们讲过的关于线性表的主体,我们可以实现一个字符串对象,在这里我们需要说明的是,python字符串是一个不可变的对象,而且它的实现是一个一体式的顺序表的实现(概念见前面文章)所以,对于一个字符串的对象,它除了有字符存储空间外还有字符串长度和一些配置信息的空间。(注意一点:python没有字符对象,单个字符也认为是一个字符串对象)所以...原创 2018-10-07 12:02:12 · 699 阅读 · 0 评论 -
python数据结构之KMP算法的实现
我相信网上已经有很多关于KMP算法的讲解,大致都是关于部分匹配表的实现思路和作用,还有就是目标串的下标不变,仅改变模式串的下标来进行匹配,确实用KMP算法,当目标串很大模式串很小时,其效率很高的,但都是相对而言。至于对于部分匹配表的作用以及实现思路,建议看一下这篇文章写的是比较易懂的,英文看不懂?那你就看别的国人写的吧,其实大概都差不多,我这里主要是用python语言实现一个部分匹配表以及实现KM...原创 2018-10-09 11:00:21 · 439 阅读 · 0 评论 -
三种数学表达式以及后缀表达式的计算
对于我们日常数学应用中最常用的中缀表达式,它其实是最复杂的一种计算方式,它增加了各种优先级运算符等,使表达式不简单;其实还有其他两种数学表达式,前缀表达式和后缀表达式。它们的实例以及计算方式如下:实例相关的中缀表达式:(3 - 5)* (6 + 17 * 4) / 3前缀表达式:实例:/ * - 3 5 + 6 * 17 4 3计算方式:前缀表达式由右往左就算,每次遇到运算符就取离该运...原创 2018-10-20 12:45:07 · 2626 阅读 · 0 评论 -
队列的实现
对于python来说,要实现一个队列的类根据已经有的方法,是很简单的。既然队列要求一端插入,一端删除。明显,python就有这两个工具,对于队列的尾部删除用pop(0)就可以做到,头部插入,用append就可以做到。从这方面来说确实很简单,但总是要找到最优解不是吗?所以我们不用pop方法,因为对于python内部实现而言,这个方法的复杂度是O(n),为什么呢?我们删除列表的首位列表的全部元素都会往...原创 2018-10-25 12:22:07 · 178 阅读 · 0 评论 -
双向循环链表的实现
其实双向循环链表与单链表的区别在于每个节点的结构发生了改变,具体的说是,每个节点多了一个指针域,用于指向上一个节点。其他的如链表对象就不需要进行改变了。新的节点类:class LNode: def __init__(self, elem=0, prev=None, next_=None): self.prev = prev self.elem = ele...原创 2018-09-27 11:04:51 · 504 阅读 · 0 评论 -
循环链表的实现
循环链表和普通单链表的差别在于,其尾节点的指针域指向头节点而不是None;对于循环单链表,我们如果把链表对象指向链表的最后一个节点,将很方便于我们对于尾部的插入,同样,对于首部的插入和删除还是O(1)复杂度没有变。class LNode: def __init__(self, elem, next=None): self.elem = elem self....原创 2018-09-27 11:00:20 · 359 阅读 · 0 评论 -
用Python实现——插入排序(两种思想)
今天在重新温习排序的时候,突然想着用Python来实现一下插入排序(之前用C语言实现过了,学Python没几天),由于语法还不是很熟悉,可以说实现过程很艰难,竟然用了哟差不多两个小时。。。。好了,那就正式写了(内含代码可以直接运行)**首先介绍一下插入排序,作为一种最简单粗暴的排序算法,理解不难,实现也不难,但其时间复杂度比其他排序算法要大点(O(logN*N)) 插入排序的工作方式:原创 2017-11-15 16:37:08 · 6865 阅读 · 3 评论 -
综述 ------ 线性表,字符串,栈和队列
忍不住想给前几个数据结构进行一下总结。对于线性表我们分为顺序表和链接表,分类的依据是节点的物理存储关系。顺序表中每个节点其物理存储关系就表现了它的节点的逻辑关系,即每个节点的存储空间都是紧挨着,也就是说一个顺序表的物理存储空间就是一大块物理存储空间。 而链接表通过节点间的链接关系将表中的节点联系起来,也就是说其节点间的逻辑关系是由链接实现的,存储上,各个节点并不是紧挨着。其中顺序表又根...原创 2018-10-11 11:36:08 · 309 阅读 · 0 评论 -
python列表的实现
从数据结构的角度来看,python列表是通过线性表来实现的,进一步来讲,是动态的顺序表来实现list的。那我们就应该首先讲一下什么是动态的顺序表?顺序表分为两类-----一体式顺序表和动态的顺序表, 动态的顺序表指的是表对象和表元素的主体不在一个存储快中,表对象通过连接的方式与存储元素的块相连。图示如下:你要是问我图片哪里来的,《数据结构与算法 python实现》。怎么个动态法呢?...原创 2018-10-11 12:02:11 · 557 阅读 · 0 评论 -
栈的实现
栈是一个LIFO数据结构,也就是后进去的元素先出来,栈中的元素没有任何的相互关联,栈可以实现的操作也很简单,除了建立空栈,判断空栈外,只有对栈顶压入元素,弹出元素,查看栈顶元素。我们通过顺序表和链接表依次来实现一个栈的类:通过顺序表实现:class StackOverFlow(ValueError): passclass Stack: maxElem = 9 ...原创 2018-10-11 12:06:46 · 137 阅读 · 0 评论 -
python列表数据结构的python实现
我们知道,python列表已经实现了一个线性表的所有操作和结构要求,它是通过C语言实现的,那么我们今天就用python语言本身再实现一次线性表的数据结构。class List: def __init__(self, *elements): self._list = list(*elements) def __str__(self): return...原创 2018-09-23 21:35:38 · 253 阅读 · 0 评论 -
顺序表(python语言描述)
首先我们说线性表(顺序表和链接表的统称):线性表是什么?它是某类元素的一个集合,而且它还表示这个元素集合中各种元素的一种顺序关系,对于两种模式的线性表,区别在于这种关系的表示上的不同。顺序表:将元素按顺序的存放在一个连续的存储区中,各个元素的顺序关系就是由他们的存储关系表示的。链接表:元素存放在由链接构造起来的一系列存储块中,也就是说,各个元素的存储块并不是连续的,它们之间的联系由元素之间的...原创 2018-09-24 11:32:29 · 652 阅读 · 0 评论 -
单链表类的实现
一个普通的单链表(一个指针域),对于其最重要的就是单链表的头指针,通过头指针可以确定单链表的一些属性,如:是不是空的,通过头指针进行遍历等。我们用python做一个单链表的类实现,要求可以建立一个空的单链表,还要能够实现一些单链表的基本操作,如判断是不是空的,头部尾部插入,删除,遍历等首先就是定于一个链表节点的类:class LNode: def __init(self, elem, ne...原创 2018-09-26 12:53:40 · 834 阅读 · 0 评论 -
包含节点数目的单链表的实现代码
class LNode: def __init__(self, elem, next=None): self.elem = elem self.next = next # 加个下划线,为了区分python中的next关键字class listObj: def __init__(self): self.nodenum = 0 ...原创 2018-09-26 21:15:33 · 397 阅读 · 0 评论 -
背包问题的实现代码
# _*_ coding: utf-8 _*_def Sum(arg): x= 0 for i in arg: x = x + i return xdef pack(weight=0, x=0, i=0, arg = 0): # if Sum(arg) < weight: # raise ValueError...原创 2018-10-23 11:42:00 · 835 阅读 · 0 评论