
数据结构
文章平均质量分 72
数据结构
liulanba
这个作者很懒,什么都没留下…
展开
-
python实现--平衡二叉树和红黑树
平衡二叉树和红黑树原创 2025-02-07 13:00:26 · 399 阅读 · 0 评论 -
python实现跳跃表
跳跃表(Skip List)是一种基于链表的数据结构,它通过多级索引实现了高效的查找、插入和删除操作。跳跃表是一种非常有效的数据结构,在需要高效查找、插入和删除操作的应用中广泛使用。通过合理的实现和配置,跳跃表可以提供接近于平衡二叉树的性能,同时具备更简单的实现和维护。查找复杂度:跳跃表的查找操作在期望时间内是 O(logn),因为它通过多层索引有效地减少了需要遍历的节点数。插入复杂度:插入操作的期望时间复杂度也是 O(logn),因为随机层次决定了节点插入的位置。原创 2024-06-13 13:02:40 · 473 阅读 · 0 评论 -
python实现--哈夫曼编码
哈夫曼树(Huffman Tree)和哈夫曼编码(Huffman Coding)是一种用于数据压缩的技术,由David A. Huffman于1952年提出。哈夫曼树是一种特殊的二叉树,用于构建哈夫曼编码。哈夫曼编码是一种变长编码,用于将字符映射到不同长度的比特串,以实现数据的高效压缩。原创 2024-03-20 12:07:55 · 1258 阅读 · 0 评论 -
python实现--拓扑排序
拓扑排序是对有向无环图(DAG)进行排序的一种算法,它可以将图中的顶点排成一个线性序列,使得图中的任意一条有向边都从序列中的较早顶点指向较晚顶点。将1号顶点的邻接顶点2号和3号的入度分别减1,得到入度为0的2号和3号顶点,加入队列:[2, 3]将2号顶点的邻接顶点4号的入度减1,得到入度为0的4号顶点,加入队列:[3, 4]将3号顶点的邻接顶点5号的入度减1,得到入度为1的5号顶点,加入队列:[4, 5]将4号顶点的邻接顶点6号的入度减1,得到入度为0的6号顶点,加入队列:[5, 6]原创 2024-03-20 12:19:25 · 672 阅读 · 0 评论 -
python实现--二叉搜索树
二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它具有以下性质:每个节点最多有两个子节点,分别称为左子节点和右子节点。对于任意节点,其左子树中的所有节点的值都小于该节点的值。对于任意节点,其右子树中的所有节点的值都大于该节点的值。对于任意节点,其左子树和右子树也分别是二叉搜索树。原创 2024-03-17 15:43:58 · 1702 阅读 · 0 评论 -
python实现B/B+树
B树和B+树都是一种多路搜索树,用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用,特别是用于构建索引结构。原创 2024-03-10 13:53:05 · 1913 阅读 · 0 评论 -
python实现--分块查找
分块查找将数据集合分成若干个块,每个块内的数据可以是有序的,而块与块之间的顺序可以是任意的。在进行查找时,首先根据块的索引查找到可能包含目标元素的块,然后在该块内进行顺序查找。查找范围缩小:通过索引表可以快速确定目标元素所在的块,从而将查找范围缩小到一个块内,然后在该块内进行顺序查找,从而减少了查找的时间复杂度。构建索引表:将线性表分成若干个块,并为每个块建立索引表,索引表中的元素记录每个块的起始位置和结束位置。块内顺序查找:根据目标元素的值,确定它所在的块,并在该块内进行顺序查找。原创 2024-03-10 13:46:33 · 622 阅读 · 0 评论 -
python实现--折半查找
以上代码实现了折半查找算法。通过不断缩小查找范围,折半查找算法可以在时间复杂度为 O(log n) 的情况下找到目标元素,其中 n 为数组的长度。它的基本思想是通过每次将查找范围缩小为原来的一半来逼近目标元素,直到找到目标元素或者确定目标元素不存在。如果目标值小于中间位置的元素,则更新右边界 right = mid - 1,缩小查找范围为左半部分。如果目标值大于中间位置的元素,则更新左边界 left = mid + 1,缩小查找范围为右半部分。如果目标值等于中间位置的元素,则返回中间位置作为查找结果。原创 2024-03-10 13:44:42 · 1225 阅读 · 0 评论 -
python实现--顺序查找
顺序查找(Sequential Search),也称线性查找,是一种简单直观的查找算法。它的基本思想是逐个遍历数据集合中的元素,直到找到目标元素或者遍历完整个数据集合。顺序查找适用于无序数据集合,时间复杂度为O(n),其中n为数据集合中的元素个数。原创 2024-03-10 13:42:23 · 979 阅读 · 0 评论 -
python实现生成树
若(u,v)是一条具有最小叔值的边,其中u∈U, v∈V- U,则必存在一棵包含边(u,V)的最小生成树,基于该性质的最小生成树算法主要有Prim算法和Kruskal算法,它们都基于贪心算法的策略。最后,打印出构建出的最小生成树的边集合。Kruskal算法:Kruskal算法是一种基于并查集的贪心算法,它首先将所有边按权重从小到大排序,然后依次考虑每条边,如果当前边连接的两个顶点不在同一个连通分量中,则将这条边加入最小生成树中,并将这两个顶点合并到同一个连通分量中,直到最小生成树的边数达到n-1为止。原创 2024-03-10 13:30:19 · 1109 阅读 · 0 评论 -
python实现回溯算法
回溯算法是一种经典的解决组合优化问题、搜索问题以及求解决策问题的算法。它通过不断地尝试各种可能的候选解,并在尝试过程中搜索问题的解空间,直到找到问题的解或者确定问题无解为止。回溯算法常用于解决诸如排列、组合、子集、棋盘类等问题。if 满足结束条件: # 如果已经满足结束条件result.append(path[:]) # 将当前路径添加到结果中returnfor 选择 in 候选集: # 遍历所有候选选择if 当前选择合法: # 如果当前选择是合法的做出选择 # 将当前选择添加到路径中。原创 2024-03-10 13:23:39 · 2807 阅读 · 0 评论 -
广度优先搜索和深度优先搜索
假设从a结点开始访问,a先入队。例题:在一个n*m的矩阵上,分布着如下数字,0代表通路,1代表墙,无法通行,2代表起点,3代表终点,4代表陷阱,6代表炸弹,现在要求从起点到终点的最短路径,0可以通行,1无法通行,陷阱则需要花费3个单位时间,6可以把上下左右的四个坐标炸为通路,请给出从起点到终点的最短距离。在广度遍历的过程中,我们可以得到一棵遍历树,称为广度优先生成树,需要注意的是,一给定图的邻接矩阵存储表示是唯一的,故其广度优先生成树也是唯一的,但由于邻接表存储表示不唯一,故其广度优先生成树也是不唯一的。原创 2024-03-09 14:07:59 · 5153 阅读 · 0 评论 -
python实现桶排序
桶排序(Bucket Sort)是一种排序算法,它将待排序的元素分到有限数量的桶(buckets)中,然后分别对每个桶中的元素进行排序,最后按照顺序将所有的桶中的元素依次取出,即可得到有序序列。桶排序的核心思想是根据待排序元素的大小将它们分配到不同的桶中,然后对每个桶中的元素进行排序,最后将所有桶中的元素合并起来得到有序序列。如果待排序数据均匀分布在各个桶中,则桶排序的时间复杂度为 O(n+k),其中 n 表示待排序元素的数量,k 表示桶的数量。遍历待排序数组,将每个元素根据其值的大小分配到对应的桶中。原创 2024-03-09 13:27:14 · 842 阅读 · 0 评论 -
python 实现动态规划
程序输出了最大价值以及选择的物品索引,使用二维数组 dp 来存储子问题的最优解,其中 dp[i][j] 表示在考虑前 i 个物品,且背包容量为 j 的情况下的最优解。step 3:边缘状态构造好以后,遍历矩阵,补全矩阵中每个位置的dp数组值:如果当前的位置是(i,j),上一步要么是(i−1,j)往下,要么就是(i,j−1)往右,那么取其中较小值与当前位置的值相加就是到当前位置的最小路径和,因此状态转移公式为dp[i][j]=min(dp[i−1][j],dp[i][j−1])+matrix[i][j]原创 2021-03-24 10:06:54 · 9241 阅读 · 0 评论 -
python3在父类的方法中调用子类重写的方法
python3在父类的方法中调用子类重写的方法原创 2021-04-06 14:12:45 · 7575 阅读 · 0 评论 -
python栈--实现四则运算
1.常规方法,用两个栈分别保存数字和符号import reclass Solution: def calculator(self, expression): # 定义符号优先级 prority = {"+": 1, "-": 1, "*": 2, "/": 2} # 使用数字栈和符号栈分别存放 number_stack, operator_stack = [], [] for each_str in expres原创 2022-04-15 00:33:15 · 7617 阅读 · 0 评论 -
python实现中缀表达式转逆波兰式
中缀转后缀需要遵循以下规则:字母直接输出2.右括号,依次弹栈并输出符号,直到遇到左括号3.字符优先级低于栈顶符号,依次弹栈直到遇到字符优先级高于栈顶符号或者遇到左括号或者空栈,当前符号再才进栈(如果和栈顶符号优先级一样也要先栈顶符号也要先弹栈,因为优先级一样运算顺序是从左往右)4.左括号直接压栈,如果栈顶元素为左括号,该字符同样直接压栈代码实现:def mid2behind(): ss=input().strip().replace(" ","") alp=[chr(x)原创 2021-09-02 00:18:57 · 7038 阅读 · 2 评论 -
python实现基数排序
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。如图所示,最左端为输入,其余各列表示了对各个不断递增的有效位连续排序后的情况,阴影部分表述当前正被排序的数位。:采用关键字排序思想,即基于关键字各位的大小进行排序,借助”分配“和“收集”两种操作对逻辑关键字进行排序。原创 2021-09-01 23:45:28 · 7355 阅读 · 3 评论 -
python实现单链表的翻转
单链表的翻转操作是指将链表中节点的指针方向反转,使得原先指向下一个节点的指针指向前一个节点,最终形成一个逆序的链表。python实现单链表的翻转实现思路:从头指针开始遍历,先获取头指针的下一个结点保留,然后调整头指针的指向,然后再把之前保留的节点赋给头结点,继续遍历。原创 2020-05-09 08:58:45 · 7008 阅读 · 0 评论 -
python实现贪心算法
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。原创 2021-04-02 12:44:09 · 10726 阅读 · 0 评论 -
python实现二叉树的遍历(递归/非递归/层序)
遍历二叉树就是以一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树节点的各种遍历序列。其实质就是对一个非线性结构进行线性操作,使在这个序列中,除了第一个和最后一个结点,每个结点都有一个直接前驱和直接后继。如果二叉树为空,则什么也不做;否则:1.访问根节点2.先序遍历左子树3.先序遍历右子树如果二叉树为空,则什么也不做;否则:1.中序遍历左子树2.访问根节点3.中序遍历右子树如果二叉树为空,则什么也不做;否则:1.后序遍历左子树2.后序遍历右子树。原创 2021-03-26 16:42:59 · 32390 阅读 · 1 评论 -
python实现归并排序
归并排序“归并"是将两个或者两个以上的有序表组成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为一,然后两两归并,得到n//2个长度为2或1的有序表;再两两归并,…直到合并成一个长度为n的有序表为止,这种方法称为2-路归并排序。...原创 2021-03-24 13:10:56 · 35221 阅读 · 16 评论 -
python:用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )栈1用于存储新的元素,栈2用于弹出旧元素appendTail:直接将新元素压入栈1deleteHead:直接弹出栈2的元素;如果栈2为空,则将栈1的元素全都压入栈2;如果栈1也为空,返回-1class ST_Queue(): def __init__(self):原创 2021-03-24 10:37:06 · 6833 阅读 · 2 评论 -
python实现交换排序
这样找到的元素小于基准元素,将它放到 low 的位置,并将 high 向左移动。6.第二个内部的 while 循环从列表的左侧开始(low 索引),如果当前元素小于基准元素,则将 low 索引向右移动一位。快速排序算法的核心思想是通过选择一个基准元素,将列表分割成两个子序列,其中一个子序列的元素都小于基准元素,另一个子序列的元素都大于基准元素。3.然后,函数定义了三个变量:low(指向当前的起始索引)、high(指向当前的结束索引)和 mid(基准元素,取列表中的第一个元素 alist[low])。原创 2021-03-23 19:48:56 · 9193 阅读 · 3 评论 -
python实现选择排序
基本思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,则经过n-1趟排序可以使得整个排序表有序。空间效率:仅使用常数个辅助单元,因此空间效率为O(1)时间效率:O(n²)它是一个不稳定的排序算法。堆排序是一种树形选择排序方法,在排序过程中,将L[1…n]看作一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。原创 2021-03-23 19:45:33 · 30462 阅读 · 4 评论 -
python实现插入排序
插入排序排序算法:python实现基数排序python实现归并排序python实现交换排序python实现选择排序python实现插入排序插入排序是一种简单直观的排序方法,其基本思想在于每次将一个待排序的记录,按照其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成。直接插入排序假设在排序过程中,待排序表L[1…n]在某一时刻的状态如下:有序序列L[1…i-1] || 待排序元素L[i] || 无序序列L[i+1…n]需要进行如下操作:1)查询待排序元素L[i原创 2021-02-23 11:11:16 · 11717 阅读 · 3 评论 -
Python实现双链表和循环链表
单链表结点中只有一个指向其后继的指针,这使得单链表只能从头结点依次顺序的向后遍历,访问后继结点时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)双链表仅仅是在单链表的结点中增加一个指向其前驱的prior指针,因此,在双链表中执行按值查找和按位查找的操作和单链表相同。但双链表在插入和删除操作的实现上,和单链表有着较大的不同。这是因为“链”变化时也需要对prior指针做出修改,其关键在于保证在修改的过程中不断链。此外,双链表可以很方便地找到其前驱结点,因此,插入,删除结点算法的时间复杂度为O(1)原创 2021-02-22 12:47:49 · 6592 阅读 · 1 评论 -
Python3:AttributeError: ‘NoneType‘ object has no attribute ‘next‘
使用Python实现线性表遇到问题,使用尾插法建立单链表(表中没有元素),就会报错:AttributeError: ‘NoneType’ object has no attribute ‘next’class linknode():#每个结点有两个数据成员,结点元素和指向下一个结点的指针 def __init__(self,item): #创建节点 self.item = item self.next = Noneclass linklis原创 2021-02-09 11:21:52 · 17619 阅读 · 1 评论 -
Python实现单链表(带头结点)
的方法前面已经讲过,但是不带头结点会有一些问题,主要就是第一个结点的处理需要和其他结点区别对待:为了操作上的方便,在单链表第一个结点之前增加一个结点,称为。头结点的数据域可以不设任何信息,也可以记录表长等相关信息。头结点的指针域指向线性表的第一个元素结点。引入头结点的好处:1)由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表中其他位置上的操作一致,无须进行特殊处理。原创 2021-02-09 11:12:38 · 10016 阅读 · 3 评论 -
python实现线性表
线性表的定义:线性表是具有相同数据类型的n(n.>=0)个数据元素的有限序列,其中n为表长,n=0时表示该表是一个空表,一般表示为:L=(a1,a2…an-1,an)逻辑特性:a1是表头元素,an是表尾元素,除了表头元素,每个元素有且仅有一个直接前驱,除了表尾元素,每个元素有且仅有一个直接后继。线性表的特点:–表中元素个数有限。–表中元素具有逻辑上的顺序性,在序列中各元素排列有其先后次序。–表中元素都是数据元素,每个元素都是单个元素。–表中元素的数据类型都相同,即每个元素占用的存储空间原创 2021-02-09 10:58:59 · 28954 阅读 · 6 评论 -
python实现队列
队列(Queue):和栈一样,也是一种操作受限的线性表,但它只允许在表的一端进行插入,在另一端进行删除。分配一块连续的存储单元,并附带两个指针front和rear分别指示队首元素和队尾元素,一般队首指针指向队首元素,队尾指针指向队尾元素的下一个位置。定义了一个 Queue 类,表示链队列,其中包含 front 和 rear 两个指针,分别指向队列的头部和尾部。4)不可以用"rear=size"来判断队列是否为满,上图(d)也满足"rear=size",但不是队列为满,这是一种假溢出。原创 2021-02-06 11:51:18 · 9942 阅读 · 8 评论 -
python实现栈
两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=maxSize时1号栈为空,仅当两个栈顶相邻时栈满:top1-top0==1。pop 方法用于弹出栈顶元素,首先检查栈是否为空,然后获取栈顶节点的值,并将 top 指针指向下一个节点,最后返回弹出的值。采用链式存储结构的栈,不存在栈满溢出的情况,便于节点的插入和删除,通常用单链表实现,并规定所有的操作都是在表头进行的。最后,我们创建一个大小为10的共享栈实例,向两个栈分别压入数据,然后从两个栈分别弹出数据,以验证共享栈的功能。原创 2021-02-05 19:55:50 · 8850 阅读 · 2 评论