数据结构
Lsang_
这个作者很懒,什么都没留下…
展开
-
数据结构总索引
1.排序算法内排序2.二叉树索引二叉树遍历非递归算法二叉树层次遍历线索二叉树遍历二叉树后序遍历寻找结点路径3.图索引非连通图深度优先遍历和广度优先遍历最小生成树拓扑排序的实现Dijkstra求单源最短路径4.其他数据结构散列表快慢指针并查集字典树5.算法数组循环左移KMP算法...原创 2020-03-05 13:12:12 · 282 阅读 · 0 评论 -
Boyer-Moore 投票算法求过半数
1. 算法步骤维护候选众数 candidate 以及该候选的出现次数 count; 初始化: candidate 为任意值,count 为0;遍历数组nums, 对于每个元素 x: 1). 若count == 0,则 candidate = x ;2). 若x == candidate x ,则count++;否则count--;遍历完成后,candidate 即为整个数组nums的众数。2. 代码实现class Solution: def majorityElement(self,原创 2020-12-01 15:44:01 · 447 阅读 · 0 评论 -
排序算法(内排序)
插入排序直接插入+折半插入+希尔排序交换排序冒泡排序+快速排序选择排序简单选择排序+堆排序归并排序基数排序算法种类时间复杂度空间复杂度稳定直接插入O(n^2)O(1)Y冒泡O(n^2)O(1)Y简单选择O(n^2)O(1)N希尔O(1)N快速O(nlog2n)O(nlog2n)N堆O(nlog...原创 2019-03-20 20:09:31 · 192 阅读 · 0 评论 -
二叉树层次遍历
LEETCODE513LEETCODE515struct TreeNode{ int val; struct TreeNode *left; struct TreeNode *right;}TreeNode,* Tree;typedef struct{ Tree *array; int front,rear;}Queue;void LevelOrder(Tre...原创 2019-03-21 21:09:35 · 282 阅读 · 0 评论 -
线索二叉树遍历
1. 对二叉树线索化之后,若结点没有右子树,则右子树指向遍历后继结点;若没有左子树,则左子树指向遍历前驱结点。2. 对线索二叉树进行遍历,即不断找结点的后继。若结点右指针直接指向了后继,那直接就有了;结点右指针没有指向后继,即有右子节点,那就通过常规方法找到后继。3. 不同二叉树线索化之后区别:中序线索二叉树:(LNR)既可以寻到结点前驱也可以寻到后继。左右指针直接指向相应结点不说...原创 2019-07-14 20:29:35 · 1673 阅读 · 0 评论 -
非连通图深度优先遍历和广度优先遍历
预定义:typedef struct ArcNode{ int adjvex; ArcNode *nextarc;}ArcNode; typedef struct VNode{ VerTexType data; ArcNode *firstarc;}VNode,AdjList[MVNum]; typedef struct{ AdjList vertices; int ve...原创 2019-03-21 20:50:42 · 5066 阅读 · 0 评论 -
最小生成树
1.简介一个连通图的生成树是图的极小连通子图,它包含图中的所有结点,并且只含尽可能少的边,即对于一个生成树,若砍去一边,就会变成非连通图,若增加一个边,就会形成回路。最小生成树为权值和最小的那棵树。2.性质不唯一,当各边权值互不相等时唯一;边的权值之和唯一;边数为定点数-1;3.构建最小生成树的主要两种方法:Kruskal算法Prim算法...原创 2019-03-21 17:47:38 · 195 阅读 · 0 评论 -
二叉树遍历非递归算法
1.结构体:struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; };typedef struct TreeNode* Tree;typedef struct{ Tree* array; int top;}Stack;2.二叉树的前序遍历(Preorder Trave...原创 2019-07-16 01:01:17 · 569 阅读 · 2 评论 -
快慢指针
1.快慢指针: 快慢指针是指两个移动速度不同的指针,一个指针移动的步长大于另一个指针(多为2倍关系)。2.有环必相遇: 当慢指针到环里的时候,快指针已经在环里了,一快一慢肯定会相遇。3.寻找入环口:结论:当快慢指针相遇时,将快指针指向链表的起点,且步长与慢指针一样为速度为1,则慢指针与快指针相遇的地方就是环的入口。原理:设环长:c,起点到环入口:x,起点到相遇点:y,相遇点到起点:...原创 2019-03-08 20:25:11 · 724 阅读 · 1 评论 -
并查集
int uset[MAXSIZE];//根节点uset[]是自己int rank[MAXSIZE];//集合层数//并查集初始化void makeSet(int size) { for(int i=0;i<size;i++) uset[i] = i; for(int i=0;i<size;i++) rank[i] = 1;}//查找根节点int fi...原创 2019-03-19 01:47:18 · 199 阅读 · 0 评论 -
散列表
1.概念散列表(也叫哈希表)是一种查找算法,在查找时不需要进行一系列和关键字的比较操作。散列表算法希望能尽量做到不经过任何比较,通过一次存取就能得到所查找的数据元素,因而必须要在数据元素的存储位置和它的关键字之间建立一个确定的对应关系,使每个关键字和散列表中一个唯一的存储位置相对应。因此在查找时,只要根据这个对应关系找到给定关键字在散列表中的位置即可,这种对应关系被称为散列函数。2.散列函数...原创 2019-03-25 18:37:58 · 2445 阅读 · 0 评论 -
字典树
#define MAXN 30//字典树节点结构体typedef struct Trie{ bool end; //是否结束 struct Trie* next[MAXN]; //子节点指针数组}Trie;//返回一个初始化好的节点Trie* trieCreate() { Trie* tree=(Trie* )malloc(s...原创 2019-03-19 01:48:57 · 177 阅读 · 0 评论 -
KMP算法
1.简单的模式匹配算法/* i=7 4 | a b a b c a b c a => 回到i=3(2下一位)的位置即i-j+2 a b c a c | j=5 */int Index(SString S,SString T){ int i=1,j=1;...原创 2019-03-23 01:18:18 · 352 阅读 · 0 评论 -
数组循环左移
1.题目:将n个整数存放到一维数组R中。试设计一个在时间和空间都尽可能高效的算法。将R中保存的序列循环左移P个位置,即将R中数据由[X0,X1, …,Xn-1]变换为[Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1]。2.代码:/*思路:即[a,b]=>[b,a],a为前p个元素,左移之后到右边。[a,b] =>[a^-1,b] =>[a^-1,b^-1] =&...原创 2019-07-01 23:41:19 · 1036 阅读 · 0 评论 -
二叉树后序遍历寻找结点路径
二叉树后序遍历原创 2019-07-16 00:48:19 · 5148 阅读 · 0 评论 -
Kruskal算法求最小生成树
Kruskal算法简单实现如下:void Kruskal(V,T){ T=V; //初始化树T,仅含顶点 numS=n; //连通分量数 while(numS>1){ //连通分量数>1 //从E中取出权值最小的边(v,u) if(v和u属于不同连通分量){ T=T∪{(u,v)}; //将边加入树中 numS--; //连...原创 2019-03-21 16:54:18 · 1841 阅读 · 1 评论 -
Prim算法求最小生成树
Prim算法简单实现如下:G=(V,E); //V顶点集合,E边结合void Prim(G){ T=∅ //初始化空树 U={w}; //添加任意顶点w while((V-U)!=∅){ //若树中不包含全部顶点 //设(u,v)是u∈U,v∈(V-U),且权值最小的边 T=T∪{(u,v)} //边并入树 U=U∪{v} ...原创 2019-03-21 15:31:07 · 719 阅读 · 0 评论 -
插入排序
1.直接插入排序:边比较边移动,找到插入位置;void InsertSort(ElemType A[],int n){ int i,j; for(i=2;i<=n;i++){ //若A[i]小于前驱,需将A[i]插入有序表; if(A[i].key<A[i-1].key){ A[0]=A[i]; //复制为哨兵,A[0]不存放元素; for(j-i-...原创 2019-03-20 14:01:16 · 222 阅读 · 0 评论 -
交换排序算法
1.冒泡排序从后往前,两两比较,若为逆序则交换;每一趟将最小的元素上浮到待排序列第一个位置;void BubbleSort(ElemType A[],int n){//表长为n for(i=0;i<n-1;i++){ flag=false; for(j=n-1;j>i;j--) //一趟冒泡,前i个有序 if(A[j-1].key>A[j].key){......原创 2019-03-20 14:50:43 · 176 阅读 · 0 评论 -
归并排序
归并排序是将两个或两个以上有序表合并成一个有序表的过程;2-路归并排序:n个记录的待排序表,看成n个有序的子表,两两合并,得到[n/2]个长度为2或1的有序表;再两两合并…,如此得到一个长度为n的有序表;//递归算法,左右根void MergeSort(ElemType A[],int low,int high){ if(low<high){ int mid=(high+low)...原创 2019-03-20 16:18:21 · 151 阅读 · 0 评论 -
拓扑排序的实现
LEETCODE207LEETCODE210预定义:#define MVNum 1000typedef char VerTexType; typedef struct{ int array[MVNum]; int top;}Stack; typedef struct ArcNode{ int adjvex; ArcNode *nextarc;}ArcNode...原创 2019-03-16 17:25:01 · 214 阅读 · 0 评论 -
Dijkstra求单源最短路径
LEETCODE743预定义:#define MVNum 100#define INT_MAX 88888//邻接矩阵typedef struct{ //int vex[MVNum]; int arc[MVNum][MVNum]; int vexnum, arcnum;}MGraph;构造邻接矩阵:int LocateVex(AMGraph *G,VerTexType ...原创 2019-03-16 22:46:17 · 282 阅读 · 0 评论 -
选择排序
1.简单选择排序每一趟从i后面选出最小的与i交换;void SelectSort(ElemType A[],int n){ for(i=0;i<n-1;i++){ min=i; //在A[i...n-1]中选择最小元素 for(j=i+1;j<n;j++) if(A[j]<A[min]) min=j; //与第i元素交换 if(min!=i...原创 2019-03-20 19:45:10 · 144 阅读 · 0 评论