Python数据结构与算法
冬 泳 怪 鸽
这个作者很懒,什么都没留下…
展开
-
Python数据结构与算法——第5-1课时——排序算法的稳定性——day74
Python数据结构与算法:第5-1课时:排序算法的稳定性排序与搜索排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。排序算法的稳定性稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。举例原创 2020-09-23 00:09:54 · 150 阅读 · 0 评论 -
Python数据结构与算法——第4-3课时——队列与双端队列的实现——day74
Python数据结构与算法:第4-3课时:队列与双端队列的实现队列队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的(First In First Out)的线性表,简称FIFO。 允许插入的一端为队尾,允许删除的一端为队头。 队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个原创 2020-09-23 00:08:05 · 135 阅读 · 0 评论 -
Python数据结构与算法——第4-2课时——栈的实现——day73
Python数据结构与算法:第4-2课时:栈的实现栈结构实现栈 可以用顺序表实现,也可以用链表实现。这里就用顺序表(序列)实现栈。栈的操作• Stack() 创建一个新的空栈• push(item) 添加一个新的元素item到栈顶(压栈、入栈)• pop() 弹出栈顶元素• peek() 返回栈顶元素• is_empty() 判断栈是否为空• size() 返回栈的元素个数以上这些实现,全部用列表的函数来实现。实现代码:class Stack(object): d原创 2020-09-19 23:46:05 · 153 阅读 · 0 评论 -
Python数据结构与算法——第4-1课时——栈与队列的概念——day73
Python数据结构与算法:第4-1课时:栈与队列的概念栈栈(stack)有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作比如可以用单链表实现栈的功能,添加数据只能用append ,删除数据只能从最后一个节点开始删除。栈描述得是数据的原创 2020-09-19 23:44:17 · 99 阅读 · 0 评论 -
Python数据结构与算法——第3-13课时——单向循环链表:查找、删除元素——day72
Python数据结构与算法:第3-13课时:单向循环链表——查找、删除元素查找元素:实现代码;def search(self, item): """查找节点是否存在""" if self.is_empty(): return False cur = self._head while cur.next != self._head: if cur.item == item: return True原创 2020-09-17 21:41:14 · 171 阅读 · 0 评论 -
Python数据结构与算法——第3-12课时——单向循环链表添加元素——day70
Python数据结构与算法:第3-12课时:单向循环链表添加元素头部插入元素:单项循环链表还需要考虑,最末的节点要指向新的头节点。同时要考虑特殊情况:为空节点时。如果为一个节点时,cur就没有cur.next这个属性了,就会报错,所以要排除空链表的状态。如果链表只有一个节点是可以实现的。实现代码:def add(self, item): """头部添加节点""" node = SingleNode(item) if self.is_empty():原创 2020-09-15 23:46:10 · 280 阅读 · 0 评论 -
Python数据结构与算法——第3-11课时——单项循环列表定义、单项循环列表遍历、求长度。——day68
Python数据结构与算法:第3-11课时:单项循环列表定义、单项循环列表遍历、求长度。尾节点的next指向了头节点。其余一样。定义:单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。操作节点的构造和单链表是一样的。节点代码实现:class SingleNode(object): """单链表的结点""" def __init__(self,item): # _item存放数据元素 sel原创 2020-09-14 21:55:38 · 254 阅读 · 0 评论 -
Python数据结构与算法——第3-10课时——双向链表删除元素——day68
Python数据结构与算法:第3-10课时:双向链表删除元素删除元素:一般情况,删除节点前后都有节点:只需要一个指针就可以了。特殊情况:头节点被删掉(是否只有一个节点)、尾节点被删掉实现代码:def remove(self,item): cur = self._head while cur != None: if cur.item == item: if cur == self._head: #用于判断原创 2020-09-14 21:47:03 · 242 阅读 · 0 评论 -
Python数据结构与算法——第3-9课时——双向链表及添加元素、判断链表是否为空——day67
Python数据结构与算法:第3-9课时:双向链表及添加元素、判断链表是否为空双向链表后继节点,某个节点,前驱节点。例子:比如40这个节点的前驱节点就是100, 后继节点就是6定义:一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。所需要的一些操作:• is_empty() 链表是否为空• length() 链表长度• travel()原创 2020-09-12 17:58:25 · 860 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-8课时:单链表与顺序表的对比——day66
Python数据结构与算法:第3-8课时:单链表与顺序表的对比链表与顺序表的对比链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。链表与顺序表的各种操作复杂度如下所示:注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找, 删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对原创 2020-09-11 13:26:12 · 115 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-7课时:单链表查找和删除元素——day66
Python数据结构与算法:第3-7课时:单链表查找和删除元素查找某个节点是否存在:def search(self,item): cur = self._head while cur != None: if cur.item == item: return True else: cur = cur.next return False这个写法包含了链表若为空集的特殊情况。删除元原创 2020-09-11 13:12:46 · 290 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-6课时:单链表头部添加和在指定位置添加——day65
Python数据结构与算法:第3-6课时:单链表头部添加和在指定位置添加在单链表尾部插入元素,尾插法头部添加叫,头插法。头部添加元素 add:实现原理:让列表头节点指向新加入元素400的地址, 400节点存放的next节点指向 100的地址。注意:但是有个先后顺序的问题,如果你先把400的地址(100的地址)赋给了 表头节点指向地址,那么100的地址你就会缺失了。后面的数据就都找不到了,所以,应该先将表头指向地址(100的地址) 赋给 400节点存放的指向地址 ,然后再把400原创 2020-09-10 02:56:06 · 375 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-5课时:单链表的判空、长度、遍历与尾部添加结点的代码实现——day65
Python数据结构与算法:第3-5课时:单链表的判空、长度、遍历与尾部添加结点的代码实现判断链表是否为空:class SingleLinkList(object): """单链表""" def __init__(self): self._head = None def is_empty(self): """判断链表是否为空""" return self._head == None求链表长度 length:比如,我原创 2020-09-10 02:51:34 · 249 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-4课时:单链表及结点的实现定义代码——day64
Python数据结构与算法:第3-4课时:单链表及结点的实现定义代码单向链表链表的结构。节点的程序实现class SingleNode(object): """单链表的结点""" def __init__(self,item): # _item存放数据元素 self.item = item # _next是下一个节点的标识 self.next = None一个节点的初始状态不知道指向哪里,所以传递一个空对象原创 2020-09-09 09:07:57 · 181 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-3课时:Python中变量标识的本质——day63
Python数据结构与算法:第3-3课时:Python中变量标识的本质节点的实现class SingleNode(object): """单链表的结点""" def __init__(self,item): # _item存放数据元素 self.item = item # _next是下一个节点的标识 self.next = None我们可以发现,节点的标识(地址)必须知道,那么再python中节点的标识具体指什么呢原创 2020-09-06 21:01:17 · 167 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-2课时:单(向)链表的ADT模型——day63
Python数据结构与算法:第3-2课时:单(向)链表的ADT模型单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域• 表元素域elem用来存放具体的数据。• 链接域next用来存放下一个节点的位置(python中的标识)这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。只能由上一个节点(元素)指向下一个(节点)• 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。节点实现c原创 2020-09-06 20:58:20 · 125 阅读 · 0 评论 -
Python数据结构与算法—第三大节课—第3-1课时:链表的提出——day62
Python数据结构与算法:第3-1课时:链表的提出链表除顺序表外,还有一种结构, 链表链表可以实现,增加一个元素,其余的元素所有信息完全不用变。来一个数据,链表就申请一个空间来存储新的元素。比如一个链表 li:元素与元素之间又关联,可以通过元素之间相互找到。为什么需要链表顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。链表的定义链表(Linke原创 2020-09-06 20:56:08 · 114 阅读 · 0 评论 -
Python数据结构与算法—第二大节课—第2-5课时:顺序表添加与删除元素;Python列表的实现——day61
Python数据结构与算法:第2-5.课时:顺序表添加与删除元素;Python列表的实现顺序表的操作1. 增加元素如图所示,为顺序表增加新元素111的三种方式a. 尾端加入元素,时间复杂度为O(1)b. 非保序的加入元素(不常见),时间复杂度为O(1)c. 保序的元素加入,时间复杂度为O(n)删除元素a. 删除表尾元素,时间复杂度为O(1)b. 非保序的元素删除(不常见),时间复杂度为O(1)c. 保序的元素删除,时间复杂度为O(n)Python中的顺序表Pytho原创 2020-09-04 21:10:12 · 386 阅读 · 0 评论 -
Python数据结构与算法—第二大节课—第2-4课时:顺序表的一体式结构与分离式结构——day61
Python数据结构与算法:第2-4.课时:顺序表数据区替换与扩充元素存储区替换一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。元素存储区扩充采用分离式结构的顺序表 ,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计原创 2020-09-04 21:06:46 · 139 阅读 · 0 评论 -
Python数据结构与算法—第二大节课—第2-3课时:顺序表的一体式结构与分离式结构——day61
Python数据结构与算法:第2-3课时:顺序表的一体式结构与分离式结构顺序表的结构与实现顺序表的结构比如要存以上四个整形数据,1328,693.。。。一个顺序表的完整信息包括两部分,一部分是表中的元素集合(数据信息),另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息(表头),这部分信息主要包括 元素存储区的容量 和 当前表中已有的元素个数 两项。顺序表的两种基本实现方式图a为一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分原创 2020-09-04 21:04:37 · 178 阅读 · 0 评论 -
Python数据结构与算法—第二大节课—第2-1课时:基本顺序表与元素外围顺序表、第2-2课时:内存、类型本质、连续存储——day60
Python数据结构与算法:第2-1.课时:基本顺序表与元素外围顺序表比如一系列数据 1,2,3,4这几个整形数值,如何把它们作为一个整体保存管理?比如集合、序列,所有单元连续存放。顺序表在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息原创 2020-09-03 22:39:41 · 153 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-8课时:数据结构的引入——day59
Python数据结构与算法:第1-8课时:数据结构的引入算法注重的是方法、没有关注对象数据的类型结构。不同的数据结构对于信息的传递保存效率也有所不同。数据结构提出问题:我们如何用Python中的类型来保存一个班的学生信息? 如果想要快速的通过学生姓名获取其信息呢?比如可以用列表存储、或者字典、元组也可以。亦或者 列表内是一个个子字典的方式来存储。通过字典可以直接通过键值对一步找到某个学生的信息。概念数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,floa原创 2020-08-30 21:00:50 · 225 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-6课时:Python列表类型不同操作的时间效率——day59
Python数据结构与算法:第1-6课时:Python列表类型不同操作的时间效率list的操作效率比较测试:以下四种列表生成方式来比较效率:from timeit import Timerdef test1(): l = [] for i in range(1000): l = l + [i]def test2(): l = [] for i in range(1000): l.append(i)def test3(): l = [i原创 2020-08-30 20:58:23 · 244 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-5课时:代码执行时间测量模块timeit——day58
Python数据结构与算法:第1-5课时:代码执行时间测量模块timeitPython内置类型性能分析例子:注意:基本步骤是指基本的一个函数语句,而不是函数的调用。append() 和 insert() 就不是基本步骤了,而是函数来,这两者之间存在效率问题。判断两者谁快谁满。timeit模块timeit模块可以用来测试一小段Python代码的执行速度。class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=)Timer是测量小段代原创 2020-08-30 20:55:11 · 137 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-4课时:常见时间复杂度与大小关系——day58
Python数据结构与算法:第1-4课时:常见时间复杂度与大小关系常见时间复杂度红色为忽略的对象注意,经常将log2n(以2为底的对数)简写成logn所消耗的时间从小到大(必须背下来)O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)练习: 时间复杂度练习( 参考算法的效率规则判断 )O(5)O(2n + 1)O(n²+ n + 1)原创 2020-08-27 21:06:11 · 122 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-3课时:最坏时间复杂度与其计算规则——day58
Python数据结构与算法:第1-3课时:最坏时间复杂度与计算规则最坏时间复杂度分析算法时,存在几种可能的考虑:• 算法完成工作最少需要多少基本操作,即最优时间复杂度• 算法完成工作最多需要多少基本操作,即最坏时间复杂度• 算法完成工作平均需要多少基本操作,即平均时间复杂度对于相同的规模,不同的其余初始条件 会导致不同的 执行步骤。例子: 比如对随机数的排序算法,如果数据本身就是规则排列的,那么计算的时间复杂度就会很小。1对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息,其原创 2020-08-27 21:02:30 · 160 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-2课时:例子的第二次尝试、算法优化 ,时间复杂度与大O表示法——day57
Python数据结构与算法:第1-2课时:例子的第二次尝试、算法优化 ,时间复杂度与大O表示法第二次尝试之前的问题进行一个更具体的优化:如果 a+b+c=1000,且 a ^ 2+b ^ 2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?思考:我们其实可以法线如果a和b的数值已经知道,那么c的数值也就知道了,这是因为:a+b+c=1000所以c=1000-a-b第一次改进将三循环简为双循环:import timestart_time=time.time()原创 2020-08-26 21:53:31 · 215 阅读 · 0 评论 -
Python数据结构与算法—第一大节课—第1-1课时:算法引入、第一次例子尝试——day57
Python数据结构与算法:第1-1课时:算法引入数据结构与算法(Python)如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器那么数据结构和算法是什么?答曰:兵法!大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,就会性能低下;引入问题:先来看一道题:如果 a+b+c=1000,且 a^2 +b ^2 =c ^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不借助公式,最笨的方法就是一个个试,这就叫做 枚举法原创 2020-08-26 21:48:17 · 225 阅读 · 0 评论