随笔分类 - 算法学习
摘要:class Trie { public: /** Initialize your data structure here. */ Trie() { memset(son, 0, sizeof(son)); memset(count, 0, sizeof(count)); idx = 0; } /**
阅读全文
摘要:什么是单调栈? 顾名思义,单调栈就是一个栈,栈中的单调的,单调栈也分为单调递增栈和单调递减栈,实质上就是把一些冗余的状态去除了。 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大 单调栈的使用场景 一般为找离某元素最近的最大(最小)的数 例题:
阅读全文
摘要:kmp算法简介 KMP算法一种改进的模式匹配算法,是D.E.Knuth、V.R.Pratt、J.H.Morris于1977年联合发表,KMP算法又称克努特-莫里斯-普拉特操作。它的改进在于:每当从某个起始位置开始一趟比较后,在匹配过程中出现失配,不回溯i,而是利用已经得到的部分匹配结果,将一种假想的
阅读全文
摘要:归并排序的思想: 确定分界点 mid=(l+r)/ 2递归排序left、right归并,合二为一 其中第三步归并的思想类似于两个有序列表合并。 归并排序时间复杂度为nlogn,且是稳定的,需要借助额外辅助空间。 #include <iostream> using namespace std; con
阅读全文
摘要:快排的本质是分治。 快排的一般思路: 选择一个标准点x使数组左边的都比x小,右边的都比x大递归处理左右数组 给出一个优美的快排模版: #include <iostream> using namespace std; const int maxn = 1e5+7; int a[maxn]; void
阅读全文
摘要:在邻接表中,删除一个顶点需要先删除其在顶点数组中的存储,再删除在其他结点中与被删除节点相关的边,具体代码如下: /* * 邻接表的定义 * 采取头结点数组+边表节点链表的结构 */ map<string,int> mmp;//映射字符串和坐标之间的关系 struct ArcNode//边表节点 {
阅读全文
摘要:采取冒泡的思想,一次选取两个,再套一层循环即可,但是由于在邻接表中表头节点和边表节点的数据类型并不一样,因此这相当于一个没有头结点的链表的排序。 可以优化一下的是:如果走一遍没有发生交换,说明已经有序了,因此就不用再进行冒泡了。可以直接跳出循环,减少循环次数。 在边表节点中,我存储的是string类
阅读全文
摘要:Dijkstra算法是求最短路径的经典算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra算法采用的是贪心算法的策略,也正是因为Dijkstra这种贪心的策略,导致了其在处理负权路上的无解,因此,使用Dijkstra算法的一大前
阅读全文
摘要:图主要用的数据结构是邻接表, 邻接表适用于稀疏图中,比较节省空间,如果在稀疏图中采用邻接矩阵的存储方式,容易造成空间上的浪费。 但邻接表中的边点用的是vector实现的,没有采取链式的结构(感觉这样写简单些,手动滑稽)。 主要实现了有向图的存储,而无向图只要在加边的时候把单向的边改成双向的即可。 例
阅读全文