![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
qq_41386300
这个作者很懒,什么都没留下…
展开
-
中缀表达式与后缀表达式之间的互转及求值
中缀表达式:常见的运算表达式,如(3+4)×5-6前缀表达式又称波兰式:运算符位于操作数之前,比如:- × + 3 4 5 6后缀表达式又称逆波兰表达式:与前缀表达式相似,只是运算符位于操作数之后,如:3 4 + 5 × 6 -中缀表达式转后缀表达式从左到右扫描表达式若遇到数字,输出若遇到运算符时:遇到“(”,直接压入栈,遇到运算符,和栈顶的运算符比较优先级,优先级高的...原创 2018-10-17 23:15:39 · 267 阅读 · 0 评论 -
python实现堆排序
思路:构建好一个最大堆根结点是最大的数,根结点和最后一个结点交换位置,然后对除了【0,n-1】个结点构造最大堆根结点和第n-2个结点交换位置,然后对除了【0,n-2】个结点构造最大堆…代码:def heap(data,root): if 2*root+1<len(data): if 2*root+2<len(data) and data[2*r...原创 2019-04-18 11:29:04 · 186 阅读 · 0 评论 -
python实现topk问题
方法1:用python中的heapq实现import heapqimport randomclass TopKHeap(object): def __init__(self,k): self.data=[] self.k=k def push(self,num): if len(self.data)<self.k...原创 2019-04-18 11:18:11 · 4336 阅读 · 0 评论 -
python实现最小堆
最小堆特点:类似一颗完全二叉树二叉树中所有的父节点的值都小于其子节点;根节点的值必定是所有节点中最小的。父节点值不大于子节点且根节点值最小称为最小堆,反之称为最大堆。最大堆和最小堆没有本质上的区别。如下图是一个典型的最小堆:方法一:从根节点(index = 0)遍历到最后一个拥有子节点的节点(index = N//2 -1),将父节点与其子节点值作比较,必要时进行交换即可。完成一...原创 2019-04-17 23:21:02 · 1578 阅读 · 0 评论 -
pyton实现平衡二叉树
二叉搜索树在最坏情况下会形成一条链,平衡二叉树的出现解决了这个问题概念平衡二叉树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 —-来自百度百科如下图,如何构造平衡二叉树?构造二叉树的时候,每次插入一个结点都去判断它是否平衡,如果不平衡就要调整,让它平衡。下面有四种调整情况:下面四种情况,树的大小...原创 2019-04-22 18:15:00 · 173 阅读 · 0 评论 -
B+树与B树的不同及B+树的特点
B树与B+树差不多,但还是存在差异B+树的总结:1.根结点只有1个,分支数量范围[2,m]。2.除根以外的非叶子结点,每个结点包含分支数范围[Ceil[m/2],m],m=3的话就是[2,3]。3.具有n棵子树的结点含n个关键字,也就是一个关键字对应一棵子树4.叶子节点包含全部关键字的信息(非叶子节点只包含索引),且叶子结点中的所有关键字依照大小顺序链接(所以一个B+树通常有两个头指针,...原创 2019-04-26 19:56:32 · 5802 阅读 · 0 评论 -
B树
B树在文件系统和数据库系统中使用较多,适用于 组织 动态的索引结构。它不是二叉树,是一种多路平衡查找树,多路是指树的分支多于二叉;平衡是指所有叶子结点均在同一层上,以避免出现单支树的情况。B树的阶:树中所有结点的孩子结点数的最大值,通常用m来表示,从查找效率来考虑通常取m>=3。定义一棵m阶的B 树(意味着某一个节点最多有m个字树,但这并不意味着m阶树就叫m叉树)。树中每个结点最多...原创 2019-04-25 23:03:37 · 1109 阅读 · 0 评论 -
用递归+分治法从数组中找出最大的两个数C语言完整代码
思路:分别找出左右两个区间的最大值和次大值,然后从这四个数里找出最大值和次大值代码:原创 2018-10-05 18:07:15 · 2736 阅读 · 0 评论 -
用动态规划实现最长公共子序列C语言
思路:有两个字符数组a,b分为三种情况:比较a,b数组当前长度的最后一个字符相等时, lsc值等于前一段值加1即:当a[i-1]==b[j-1]时(因为i,j是从1开始,所以是a[i-1],b[j-1]),lsc[i][j]=lsc[i-1][j-1]+1不相等,把a数组的最后一个字符去掉的最长公共子序列大于把b数组的最后一个字符去掉的最长公共子序列即:当lsc[i-1][j]&g...原创 2018-10-06 13:43:10 · 2606 阅读 · 0 评论 -
python实现二叉搜索树
1. 定义二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree)。二叉搜索树是具有有以下性质的二叉树:(1)若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。(2)若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。(3)左、右子树也分别为二叉搜索树。2. 相关操作2.1 插入从根节点开始,若插入的值...原创 2019-04-23 09:34:03 · 647 阅读 · 0 评论 -
哈希 (含python代码)
哈希(hash)也叫散列;是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值(哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出)。在数据结构中,使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表。在数...原创 2019-04-23 19:11:07 · 548 阅读 · 0 评论 -
打印A-Z这26个字母的所有子集——python实现
题目:有一个集合由A-Z这26个字母组成,打印这个集合的所有子集,每个子集一行,使用C/C++实现,不要使用递归。分析:该题可参见著作《编程之法:面试和算法心得》。26个大写字母,乍一看真没啥思路,假设只有三个字母ABC,那么子集有:{}ABCABACBCABC把ABC看作三个比特位,分别为:000100010001110101011111对上面的比特...原创 2019-08-20 13:24:10 · 1926 阅读 · 1 评论 -
python实现二叉树翻转
题:给定一棵二叉树,要求输出其左右翻转后二叉树的中序遍历。例: 翻转前: 翻转后: 1 | 1 / \ | / \ 2 3 | 3 2 / \ | / \4 5 | 5 4思路:镜像翻转:只需要遍历二叉树,每次访问一个结点时,交换其左右孩子,然后递归的翻转左右孩子。...原创 2019-06-03 21:16:22 · 1957 阅读 · 0 评论 -
python实现求两个链表的第一个交叉结点
方法一两个有公共节点的链表自公共节点后是重合的。可以借助两个栈先存储链表的节点。然后两个栈每次出栈一个节点,如果是重合节点,那么这两个节点是相等的。所以最后一个相等的节点就是第一个公共节点。方法二先遍历两个链表,统计长度len1,len2。让长链表先走 | len1-len2 | 步,公共节点肯定是存在于后面部分中。然后再对两个链表遍历匹配,遇到的第一个相同节点就是公共节点。法一代...原创 2019-06-03 20:57:07 · 397 阅读 · 0 评论 -
柱状图中最大的矩形问题 python实现
问题:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 ,求在该柱状图中,能够勾勒出来的矩形的最大面积?以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位思路:简单思路就是:对每一个柱子都求出它所能勾画出的最大面积,最后找出最大的即可对上例中:最大面积...原创 2019-05-24 23:36:46 · 1071 阅读 · 0 评论 -
set的实现原理
参考:https://www.cnblogs.com/linshuhui/p/9580620.htmlhttps://heipark.iteye.com/blog/1743819转载 2019-05-24 18:38:57 · 2486 阅读 · 0 评论 -
限流算法
在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了。通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的。本篇文章将会介绍一下常用的限流算法以及他们各自的特点。1、计数器算法计数器算法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过1...原创 2019-05-24 17:03:15 · 215 阅读 · 0 评论 -
找出一个数组中之出现一次的两个数
在实现这个问题之前我们先实现这个问题:找出一个数组中之出现一次的一个数利用异或的特性:一个数异或0结果是这个数本身一个数异或1结果是对这个数取反所以从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,(因为一个数和它的本身异或肯定是0,那些出现两次的数字全部在异或中抵消掉了,)def find(data): res=0 for num in data: ...原创 2019-05-24 16:28:21 · 122 阅读 · 0 评论 -
有权图的单源最短路径算法C语言
基本框架代码实现以下图为例,结点是0,1,2,3,4,5,6#include <stdio.h>#include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */#define El...原创 2018-11-28 20:56:17 · 2021 阅读 · 0 评论 -
最小生成树之Kruskal算法C语言
基本思路每次都找到不会构成回路的最小边,把这条边的结点收录举例如下图:找到最小边1,把v1,v4收录找到最小边1,把v6,v7收录找到最小边2,把v2收录找到最小边2,把v3收录找到最小边4,找到最小边6,把v5收录代码#include <iostream>#define MAX 11111#define SIZE 10int root[SIZE...原创 2018-11-29 20:27:33 · 1935 阅读 · 0 评论 -
线性结构应用之多项式相加
存储结构typedef struct node{ int coef; int expon; struct node* next;}polyN;创建无头结点的链表polyN* creatPoly(){ polyN* p=(polyN*)malloc(sizeof(node)); p=NULL; return p;}添加结点(头插法)void add(po...原创 2018-10-19 22:37:11 · 124 阅读 · 0 评论 -
线性表之链式存储
链表的存储结构typedef int ElementType;typedef struct Node{ ElementType data; struct Node* next;}LNode;链表的基本运算链表的初始化没有头结点的链表LNode* init(){ LNode* List=(LNode*)malloc(sizeof(Node*)); List=NULL;...原创 2018-10-16 17:22:01 · 86 阅读 · 0 评论 -
队列的链式存储
存储结构typedef struct node{ ElementType data; struct node* next;}QNode;typedef struct{ QNode* front; QNode* rear;}Queue;创建一个带头结点的队列Queue* CreateQueue(){ QNode* head=(QNode*)malloc(size...原创 2018-10-18 20:53:50 · 93 阅读 · 0 评论 -
循环队列的顺序存储
存储结构#include <stdio.h>#include <stdlib.h>#define MAXSIZE 3#define ElementType inttypedef struct node{ ElementType data[MAXSIZE]; int front;//队头指针,永远指向第一个元素的前一个 int rear;//队尾指针,...原创 2018-10-18 20:05:31 · 163 阅读 · 0 评论 -
堆栈的链式存储
堆栈的链式存储结构#include <stdio.h>#include <stdlib.h>#define ElementType inttypedef struct node{ ElementType data; struct node* next;}Stack;基本操作创建带头结点的空栈Stack* creatStack(){ Stack...原创 2018-10-18 15:18:34 · 154 阅读 · 0 评论 -
堆栈的顺序存储
堆栈的顺序存储结构#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#define ElementType inttypedef struct node{ ElementType data[MAXSIZE]; int top;}Node;基本操作判空bool isEmpty(Node*...原创 2018-10-18 14:50:44 · 184 阅读 · 0 评论 -
最大子列和问题3种解法C语言
算法1找出所有的子列和,返回最大的int MaxSubseqSum1(int str[],int n) //时间复杂度为O(n*2) { int maxsum=0; for(int i=0;i<n;i++){ int sum=0; for(int j=i;j<n;j++){ sum+=str[j]; if(sum>maxsum) maxsum...原创 2018-10-07 20:15:01 · 355 阅读 · 0 评论 -
线性表之顺序存储
顺序表的存储结构# define MAXSIZE 10typedef int ElemType;typedef struct LNode{ ElemType data[MAXSIZE]; int length;}Node;顺序表的基本运算顺序表的初始化void init(Node* List){ List->length=0;}顺序表的添加(末尾添加)...原创 2018-10-13 21:32:27 · 77 阅读 · 0 评论 -
二叉树的前序,中序,后序的遍历的递归和非递归代码-C语言
#include <stdio.h>#include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop *///二叉树的存储结构typedef struct TreeNode{ char data...原创 2018-10-26 20:54:36 · 686 阅读 · 0 评论 -
二分查找-C语言
代码实现#include <stdio.h>//因为data[0]中存的是要查找的数,所以如果返回值为0,说明没找到 int BinarySearch(int data[],int length){ int left=1; int right=length; while(left<=right) { int mid=(left+right)/2; if...原创 2018-10-24 21:12:57 · 122 阅读 · 0 评论 -
最小生成树之Prim算法C语言
基本思路举例如下图dist的初值都设为11111;vcount=0用来标记收录的个数刚开始把结点v1收录,dist[v1]=0代表已经收录; 更新结点v1的未被收录的邻结点的dist值:dist[v2]=2,dist[v3]=4,dist[v4]=1然后找到未收录结点中最小dist是v4,把v4收录,dist[v4]=0 更新结点v4的未被收录的邻结点的dist值:dist[v...原创 2018-11-29 17:07:50 · 565 阅读 · 0 评论 -
多源最短路径C语言代码实现
基本框架代码实现以下图为例,结点是0,1,2,3,4,5,6#include <stdio.h>#include <stdlib.h> #define ElementType int#define SIZE 10typedef struct GraphNode{ int G[SIZE][SIZE]; }Graph;void Floyd(Gra...原创 2018-11-28 21:17:45 · 847 阅读 · 0 评论 -
根据先序遍历和中序遍历推后序遍历C语言
事实上,一个中序遍历的算法中入栈的过程中,如果你把每个入栈的结点保存起来,你会发现这些结点就是先序遍历的结果,同样,出栈就是中序遍历,如下图核心算法先序遍历的第一个结点一定是根结点,也是后序遍历的最后一个结点,找到它在中序中的位置 i ,那么 i 的左边就是左子树,右边是右子树,递归的求解左右两边代码#include <stdio.h>#include <std...原创 2018-11-22 19:16:38 · 3110 阅读 · 4 评论 -
图之完全二叉搜索树C语言
什么是完全二叉搜索树?基本思路这里采用数组,因为是完全二叉树,所以不会浪费空间,树的层序遍历就是数组的顺序输出,所以这里用数组比链表更合适需要先将放结点数组T【】升序排好序,根据结点总数求出完全二叉树根结点的左子树的个数假设是 i 个,那么根结点就是第 i 个结点即R【0】=T【i】,然后递归的求解左右子树即可如上图,左子树有6个结点,所以R【0】=6;再求左子树的左子树的结...原创 2018-11-22 19:05:57 · 478 阅读 · 0 评论 -
无权单源最短路径C语言
问题:如上图,找v3结点到其他六个结点的最短路径?基本思路:类似于BFS这里需要两个数组:dist[i]用来存放结点v3到结点 i 的最短距离;path[i]用来存放最短路径中结点 i 的上一个结点,例d[i]=v3意思就是v3的下一步到 i基本思路:把初始结点入队,然后出队一个结点p,对于p的每个相邻结点 i 入队,并且设置dist【i】=dist【p】+1;path【i】...原创 2018-11-22 17:46:12 · 519 阅读 · 0 评论 -
集合及运算
可以用树表示集合,树的结点代表集合的元素存储结构这里采用数组的存储形式#define ElementType inttypedef struct SetNode{ ElementType data; ElementType parent;}SetType;int size=0;创建集合因为创建不是要讨论的核心,为了方便,这里采用了暴力的创建方法为了区分根结...原创 2018-11-06 21:12:08 · 157 阅读 · 0 评论 -
堆
存储结构#include <stdio.h>#include <stdlib.h>#define ElementType int typedef struct HeapNode{ ElementType* data; int size;//当前容量 int maxsize;//最大容量}MaxHeap;建堆MaxHeap* CreatHea...原创 2018-11-01 23:56:40 · 87 阅读 · 0 评论 -
二叉搜索树的查找,删除,插入-C语言代码
1. 什么是二叉搜索树?2. 基本操作2.1 存储结构#include <stdio.h>#include<stdlib.h> #define ElementType int typedef struct TreeNode{ ElementType data; TreeNode* lchild; TreeNode* rchild;}BinSearc...原创 2018-11-01 10:03:49 · 658 阅读 · 0 评论 -
36进制加法问题——python实现
问题描述:36进制由0-9,a-z,共36个字符表示,’0’ ~ '9’对应十进制的0 ~ 9,‘a’ ~ 'z’对应十进制的10 ~ 35例如:‘1b’ 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47要求:按照加法规则计算出任意两个36进制正整数的和如:按照加法规则,计算’1b’ + ‘2x’ = ‘48’代码:def add(s...原创 2019-08-20 19:31:17 · 1224 阅读 · 1 评论