数据结构与算法
alex1997222
。。。。
展开
-
(模板)循环队列
class MyCircularQueue {public: vector<int> q; int hh,tt,qsize; MyCircularQueue(int k) { q.resize(k); hh = -1,tt = -1,qsize = k; } bool enQueue(int value) { if(isFull()) return false; if(isEmpty()).原创 2021-01-28 13:47:05 · 106 阅读 · 0 评论 -
快速幂算法(模板)
本质是二进制法while(b) { if(b&1) res=res*a%p; b>>=1; a=a*a%p; }原创 2021-01-19 05:27:34 · 167 阅读 · 0 评论 -
利用栈实现DFS
public static void DepthFirstSearch<T>(Graph<T> graph, Vertex<T> sourceVertex) { foreach(Vertex<T> vertex in graph.Vertices) //初始化每一个结点 { ...原创 2020-03-23 10:07:18 · 1399 阅读 · 0 评论 -
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
A* 寻路算法原文地址:http://www.gamedev.net/reference/articles/article2003.asp概述虽然掌握了A*算法的人认为它容易,但是对于初学者来说,A*算法还是很复杂的。搜索区域(The Search Area)我们假设某人要从A点移动到B点,但是这两点之间被一堵墙隔开。如图1,绿色是A,红色是B,中...转载 2020-03-05 23:26:57 · 2586 阅读 · 0 评论 -
静态链表及应用
一般链表都是动态的,需要指针来建立结点之间的连接关系。不过一些结点的地址是比较小的整数,这样就没有必要去建立动态链表,可以使用静态链表去建立结点之间的关系静态链表的原理是hash,建立一个结点结构体数组,数组的下标直接表示结点的地址,可以通过下标(结点的地址)来达到直接访问的效果,同时静态链表是不需要给出头节点的,只需给出某个结点的地址,就可以实现部分(或全部)遍历const int M...原创 2019-01-19 16:26:45 · 1098 阅读 · 0 评论 -
(模板)堆的快速搭建
堆排序是指使用堆结构对一个序列进行排序的过程,此处讨论递增排序的情况考虑对一个堆来说,堆顶元素是最大的,因此在建堆完毕后,思路就是取出堆顶元素,然后将堆的最后一个元素替换至堆顶,再进行一次针对堆顶元素的向下调整--如此重复,直到堆中剩下最后一个元素为止如此重复,直到堆中只剩下最后一个元素为止我们可以直接用一个数组来表示堆,const int maxn = 1001;int ...原创 2018-11-08 21:41:32 · 416 阅读 · 0 评论 -
(模板)AVL树的实现
#include <iostream>#include <algorithm>using namespace std;class ANode {public: int v, height; //v表示权值,height表示树的高度 ANode *lchild, *rchild; //左右孩子的结点信息};//建立一个新的结点ANode* c...原创 2018-11-05 09:19:55 · 356 阅读 · 2 评论 -
SBTree的概念以及代码实现
SBTree与AVL树具有相同的概念,也具有相同的操作类似自平衡,旋转操作和旋转的触发这三方面介绍SBTreeSBTree严格遵循下列公式,如有违反,则需要通过相应的转置操作来达到平衡SIZE[right[t]] >= max(SIZE[left[left[t]]], SIZE[right[left[t]]]);SIZE[left[t]] >= max(SIZE[left[...原创 2018-11-03 21:24:38 · 2299 阅读 · 0 评论 -
归并排序代码模板(参考用)
class Vector {private: int size, length; int *data, *temp; void merge_sort(int l, int r) { //如果l==r说明两个指针移动到了同一个元素上,此时return即可 if (l == r) { return; } int mid = (l + r) / 2; merge_so...原创 2018-10-09 19:46:58 · 448 阅读 · 0 评论 -
(方法)利用层序遍历返回二叉树上的节点
我们在查找二叉树上的节点时,会通过递归去进行遍历,如果我们要把这个节点作为函数返回值进行返回的话,递归遍历法就无法满足我们可以通过层序遍历去查找结点然后进行返回,只需一个辅助队列就行中序遍历的思想很简单(1)先将父亲结点入队(2)如果父亲结点的左子不为空,左子入队(3)如果父亲结点的右子不为空,右子入队(4)父亲结点出队(5)重复上述操作直到队列为空我们通过层序遍历...原创 2018-10-05 16:18:47 · 768 阅读 · 0 评论 -
(方法)二叉树的广义表形式,建树和输出
二叉树的广义表示形式:a:表示根节点为a,左右节点均为空a(b):表示根节点为a,左节点为b,右节点为空a(,c):表示根节点为a,左节点为空,右节点为ca(b,c)表示父节点为a,左子节点与右子节点分别为b和c同样的表示方法还有a(b(d),c) 存储广义表二叉树的方法:将广义表创建成二叉树,可以借助栈来实现。利用栈先进先出的特点,如果左孩子节点不为空,则将其...原创 2018-10-05 16:08:34 · 15603 阅读 · 2 评论 -
哈希表(模板,参考用)
哈希表又叫做散列表,关键值通过哈希函数映射到数组上,查找时通过关键值直接访问数组哈希函数指的是关键值和存储位置建立的对应关系,查找时只要根据这个关系就可以找到目标位置哈希表里,可能存在关键字不同但是哈希地址相同的情况,会产生冲突,一般情况下,冲突是不可避免的,因为关键字集合往往比哈希地址集合大很多哈希表的构造方法:(1)直接寻址法:即取关键字的指或者关键字的某个函数变换值,线性映射...原创 2018-09-25 20:13:51 · 1699 阅读 · 0 评论 -
链表实现模板(参考用)
链表想象成火车,火车头看做是链表的表头,车厢里载的人和物就是元素的数据域连接车厢的不见就是元素指针,由此,链表的特点是:元素之间前后依赖,串联而成还有,我们可以发现,链表的元素不能随机访问,在火车中行走,只能挨个走过去,而不能直接跳过去另外,除了火车头,每节车厢前面之连接一节车厢;除了最后的车厢。这也是链表的特点:元素前面和后面不会出现多个元素相连的情况 找到链表中要插入的...原创 2018-09-12 15:09:43 · 3186 阅读 · 0 评论 -
循环队列的模板实现(参考用)
循环队列的插入应该遵循这么一个公式来判断插入的位置pos = (pos + 1) % length; 其中length表示元素的个数循环队列中应该具有的元素如下:template <typename Type> class Queue {private: Type *data; int head, tail, length, count; //通过判断元素个数,...原创 2018-09-16 09:22:58 · 488 阅读 · 0 评论 -
并查集
森林:森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集并查集:并查集的结构和森林十分相似,是用于解决不相交集合如下若干几种操作的统称1.MAKE_SET(x):初始化操作,建立一个只包含元素x的集合2.UNION(x,y):合并操作,将包含x和y的集合合并成一个新集合3.FIND_SET(x):查询操作,计算x所在集合(一般用于求不相交集合的并集)通常我...原创 2018-11-12 09:26:23 · 230 阅读 · 0 评论 -
贪心算法的应用(PAT 1070 Mooncake)
贪心法是求解一类最优化问题的方法,它总是考虑局部情况下的最优解比如在huffman树的构造中,利用贪心算法依次选取数组中权值最大的两个结点组合成新的结点,依次类推该算法确定全局结果是最优的(每一次决策都是最优的决策)比如下面这么一道题:Mooncake is a Chinese bakery product traditionally eaten during the Mid-Au...原创 2019-01-10 20:26:28 · 276 阅读 · 1 评论 -
数据结构 迪杰斯特拉算法提高:多路径多权重解决方式
迪杰斯特拉算法基础篇见:https://blog.csdn.net/alex1997222/article/details/87113058有的时候在图中,1个点到另一个点的最短路径不止一条,这时后会有除去距离外其他权重用于判断(比如花费,物资收集等)这样的题型一般分为以下三种情况:(1)给每条边再增加一个边权(比如花费),然后要求在多条最短路径上选择花费最少的那条一般解决方式是,...原创 2019-02-12 21:15:46 · 1013 阅读 · 0 评论 -
数据结构 迪杰斯特拉算法基础+模板
Dijkstra算法用来解决单源最短路径问题,即给定图G和起点s,通过算法就可以得到S到达其他每个顶点的最短路径。比如下面这张图中,求得了某个结点到达其他各个结点的最短路径算法的具体步骤如下:我们定义带权图G所有顶点的集合为V,接着我们再定义已确定最短路径的顶点集合为U,初始化集合U为空。然后执行下面操作1.首先我们将起点x加入集合U,并在数组A中记录起点x到各个点的最短路径(...原创 2019-02-12 20:48:59 · 1860 阅读 · 0 评论 -
最长不下降子序列自实现
在学习动态规划过程中,下面是我自己实现的LIS,时间复杂度O(n),不知道正确与否,先记下来#include <iostream>#include <algorithm>#include <math.h>using namespace std;const int MAXN = 510;int N;int LF[MAXN];int LDp[MA...原创 2019-02-15 21:57:29 · 159 阅读 · 0 评论 -
数据结构 拓扑排序
拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点,如果存在u->v,那么u一定在v的前面比如在这张图中,学科的学习要按照一定的顺序,学习了某些课程后,才能学习接下来的课程学习顺序就可以按照拓扑排序算法得出:1.定义1个队列Q,并把所有入度为0得结点加入队列Q2.取队首结点,输出。然后删除它所有从它出发的边,然后令这些边到达的结点的入度-1...原创 2019-02-14 21:33:55 · 1457 阅读 · 0 评论 -
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
关于最近的公共祖先,如上图所示4和5的最近公共祖先是2,5和3的最近公共祖先是1,2和1的最近公共祖先是1。LCA问题一个好的解决思路是Tarjan算法,关于算法的思想见:https://www.cnblogs.com/JVxie/p/4854719.html,这篇博客的讲解比较通俗易懂,我根据博主给出的算法思路用代码进行了实现。int tAncestor = -1;void ta...原创 2019-01-28 14:44:17 · 271 阅读 · 0 评论 -
(模板)已知二叉树先序(后序)中序,求这棵二叉树
这种题型为考研常考题型。看这张图就比较好理解了,先序的第一个元素或后序的最后一个元素为当前子树的根确认先序/后序的根后,我们遍历中序序列寻找根在中序序列中的位置,上图中为ink,那么ink左边的序列位于二叉树的左子树部分,ink右边的序列位于二叉树的右子树部分我们确认左子树部分k个元素,就可以确定子树区间了先序左子树区间 [POSTL+1,POSTL+k]先序右子树区间 [...原创 2019-01-22 19:39:21 · 292 阅读 · 0 评论 -
归并算法的非递归实现
根据归并算法的实现原理我们得知:每次分组时组内元素个数上限都是2的幂次方我们可以令步长step的初值为2,然后将数组中每step个元素作为一组,将其内部进行排序,(将左step/2个元素和右step/2个元素合并),再令step/2 乘以 2,执行同样的操作如果step/2大于数组长度,那么算法终止3 1 2 8 7 5 9 4 0 6分组3 1 | 2 8 | 7 5 |...原创 2019-01-16 21:20:49 · 2784 阅读 · 0 评论 -
(模板)深度优先遍历与背包问题
深度优先算法除了可以解决图遍历问题,还可以解决背包问题,主要思想是遇到岔路:选还是不选比如背包问题:对于每件物品都有选或者不选两种情况,好比迷宫中的岔路,这时候我们可以利用深度优先算法思想遍历出所有的情况,然后选择不超过V的同时物品价值最大的情况void DFS(int index, int sumW, int sumC) { //递归到界限的话,退出循环 if (index...原创 2019-01-21 17:41:16 · 770 阅读 · 0 评论 -
贪心法的应用(2) 区间交集问题
问题描述:给出N个开区间(X,Y),从中选择尽可能多的开区间,使得这些开区间两两之间没有交集例如对开区间(1,3),(2,4),(3,5),(6,7)来说,可以选出最多3个区间(1,3),(3,5),(6,7)思路:首先对区间进行排序,将x较小的区间排在前面,因为如图a所示,区间越小,所能容纳的空间就越大排序完成后,从最小的区间的下一区间开始,依次比较下一区间的x是否大于上...原创 2019-01-11 18:22:57 · 670 阅读 · 0 评论 -
数据结构 循环链表
循环链表循环链表的操作和线性链表基本一致,差别仅仅在算法中的循环条件,p或p->next 是否为空下面是代码: #include<iostream>#include<stdlib.h>#include<algorithm>#define initSize 100 using namespace std;typedef i...原创 2017-09-11 21:55:04 · 310 阅读 · 0 评论 -
算法导论阅读顺序
对于学计算机的,特别是搞开发的人来说,算法是一个很重要的内功,其重要性不言而喻。同时也是较难的一个点。当你被人安利了无数次《算法导论》,拿起书却发现根本读不下去。本场 Chat 我将告诉你对于一个入门的新手来说应该如何以正确的姿势在 10 天内读完这本书的基础部分的,我会一步一步告诉大家每一章应该怎么读,具体到读书的顺序。亲测有效!算法基础部分包括:算法在计算中的应用算法基础函数增转载 2017-12-08 19:18:46 · 1253 阅读 · 0 评论 -
数据结构 线性表
在线性表中存在唯一的第一个元素和最后一个元素除第一个元素外 其他元素有且仅有一个直接前驱, 第一个元素没有直接前驱除最后一个元素外, 其他元素有且仅有一个直接后继 最后一个元素没有直接后继线性表中元素和位置之间可以有关系 也可以没有关系用顺序存储方式实现的线性表称为顺序表 它是用向量作为其存储结构的(即一维数组)顺序表的静态存储结构:extarea re原创 2017-09-08 18:59:13 · 247 阅读 · 0 评论 -
动态规划-再次理解最长上升子序列
问题描述:给定一串序列:如(3,1,4,8,12,64,7)从中找到最长的上升子序列: 如这个例子中为3,4,8,12,64思路:利用动态规划确定状态:当以N元素为终点时,N元素前的最长上升子序长度子问题汇总:所有状态下的长度的最大值边界条件:当以第一个元素为终点时 长度为1状态转移:MAXSUM[i] = max(MAXSUM[i], MAXSUM[j]原创 2017-09-24 15:27:38 · 199 阅读 · 0 评论 -
数据结构 快速排序
快速排序的实现:一组数据:7, 1, 3, 4, 8, 6, 9, 11, 17首先设置1为比较键key(这点很重要!!!)然后设置起始位置指针指向7, 末尾位置指针指向177, 3, 4, 8, 1, 6, 9, 11, 17^ ^先从右边开始 不断移动指针 直到找到一个比key小的值交换6和7...原创 2017-09-07 21:21:24 · 234 阅读 · 0 评论 -
动态规划-数字三角形
Description73 88 1 02 7 4 44 5 2 6 5(Figure 1)Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that st原创 2017-08-19 12:40:23 · 320 阅读 · 0 评论 -
二分查找法的递归实现
算法是一个有限的指令集它接收一些输入然后原创 2017-09-24 10:35:49 · 591 阅读 · 0 评论 -
归并排序
归并排序是一种效率较高的排序算法,总体时间复杂度为O(logn)它主要分成归和并两部分操作来进行:归:将当前数组分成两部分并:将两部分排好序的区间合并成一个排好序的较大的空间我们通过下面一组例子来进行演示:比如我们要对[5,1,9,8,3,6,4,7]进行排序将数组分成两部分:5 1 9 8 3 6 4 7l ...原创 2017-09-06 19:18:40 · 213 阅读 · 0 评论 -
数据结构 插入排序的坑以及思想纠正
有一组数据8 2 3 1 10 9 6插入排序的思维:先将第二个数字和第一个进行比较:如果后者较小将8和2进行交换结果:2 8 3 1 10 9 6之后看3: 3小于8 所以交换之 然后3比2大 符合正确顺序 则不交换结果2 3 8 1 10 9 6之后看1 1比8小 交换 比3原创 2017-09-05 23:01:25 · 252 阅读 · 0 评论 -
动态规划-最长上升子序列
#include #include #include using namespace std;const int MAXN = 1010;int N; //查看一共有多少数int a[MAXN];int MaxLen[MAXN];void main() { //输入状态 cin >> N; for (int i = 1; i <= N; i++) { cin转载 2017-08-19 16:10:03 · 240 阅读 · 0 评论 -
数据结构 单向链表
如图所示 单项链表节点有两个域:指针域与数据域 定义如下:typedef int dataType;class node { friend class nodeList; private: dataType data; //数据域 node* link; //指针域 一个指向下一个元素的指针};同时拥有一个节点链表用来存储数据:定义如下class nod原创 2017-09-11 20:26:00 · 362 阅读 · 0 评论 -
数据结构 图的初始化
什么是图?图是表示“多对多的关a系” 包含:一组顶点, 通常用V表示顶点集合一组边:通常用E表示边的集合边是顶点对:(v,w)表示从V指向W(无向边)有向边 表示从v指向w的边---> 单行线不考虑重边和回路图的类型:无向图:没有方向的图有向图:拥有方向的图,两条点之间的边带有箭头网络图:边带权重的图如何在程序中实现一个图?(1)原创 2017-10-23 23:53:07 · 6389 阅读 · 0 评论 -
数据结构 图的邻接矩阵表示法
对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表,即数组与链表相结合的存储方法。邻接表的处理方法是这样的。1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。2、图中每个顶点vi的所有邻原创 2017-11-02 00:27:03 · 1260 阅读 · 0 评论 -
数据结构 优先队列 Huffman树及代码实现
优先队列:在优先队列中,元素从队尾进入,从队首删除相比优先队列,优先队列里的元素增加了优先级属性例如huffman编码就用到了优先队列的思想在Huffman编码中,树上每一个结点存储字母出现的频率,根结点到结点的路径即是字母的编码[频率高的字母用较短的编码表示,频率低的字母用较长编码表示]具体实现步骤:步骤1:从集合里取出两个根结点权值最小的树a和b,构造出一棵新的二叉树c...原创 2017-10-22 12:27:42 · 727 阅读 · 0 评论 -
数据结构 堆以及堆排序
堆的概念:堆可以看作是一棵完全二叉树,除最后一层外,每一层都是填满的,最后一层从左到右依次填入在堆上,对任意一个结点来说,越接近顶部,权值就越大(一般指大顶堆),并且它的权值大于等于它所在子树所有点的权值我们把根结点权值大于等于树中结点权值的称为大根堆,小于等于树种结点权值的称为小根堆下图就是一个大根堆的示意图 就如上述大顶堆示意图一样,我们可以用一个数组来维护大根堆...原创 2017-10-20 19:58:08 · 324 阅读 · 0 评论