线段树入门
摘要:线段树是一种比较复杂的数据结构,可用来对一个数组进行维护(查询,求和,计算等)操作。 1. 线段树的特点 线段树是一种二叉树,它的每个节点,存储的是原始数组内一段区间内的某些信息,这些信息满足(幺)半群的性质。每个节点的左右孩子存储的区间为父节点区间的一半。设父节点是存储[L,R]区间,L,R为左右
阅读全文
拓扑排序
摘要:拓扑排序 一、有向无环图 学习拓扑排序必须先要了解有向无环图(Directed Acyclic Graph,DAG)。有向无环图,顾名思义就是不存在环结构的有向图。从有向无环图的任意一个顶点出发,都没有办法回到该节点。 二、拓扑排序 拓扑排序是关于DAG图最重要的应用之一。拓扑排序将DAG图排列成一
阅读全文
字典树
摘要:字典树是一种多叉树,一般用来存储一个字符串集合。字典树的边记录了字符串的一个字符,从根节点出发,不同路径就相当于不同的单词(或者单词前缀),为了确定字符串是不是到头了,需要为每个节点记录一个标志,用以判断。下面是字符串集合和字典树的对应关系。 字典树的数据结构: 1 struct TrieNode{
阅读全文
树状数组——二进制和区间相关计算的巧妙结合
摘要:前言 在数组,我们常常会遇上区间求和相关的问题,即求数组A中第i个元素到第j个元素(i<j)之和。 这个问题看起来比较简单,只需要累加即可:
Sum(i,j)=A[i]+A[i+1]+...+A[j] 但是在面对大数据量的时候,它的时间复杂度也很高,而且如果需要进行多次查询,我们可能会进
阅读全文
高效的有序链表查询结构——跳跃表
摘要:最近在做项目的时候,遇到了跳跃表这种数据结构,仔细研究了之后发现这是一种很有用的数据结构,值得写一篇博客来记录一下。 1. 跳跃表的作用 大家都清楚,对于有序数组,我们可以通过二分法将查找元素的复杂度降到O(logn)。可是因为存储地址不连续,我们没办法将二分法运用到有序链表中。跳跃表就是用来解决这
阅读全文
算法思想(一)——分治算法
摘要:分治算法是五大常用算法之一,准确的说它并不是一种特定的算法,而是一种算法思想。分治的意思就是分而治之。当一个问题的规模很大的时候,我们可以尝试将它分解为多个子问题,然后再将这些子问题的解合并汇总起来,得到原问题的解。分治算法可以总结为四个特征,三个步骤。 分治算法的四个特征: 1. 问题缩小到一定规
阅读全文
二叉搜索树
摘要:二叉搜索树介绍 二叉搜索树(Binary Search Tree,简称BST),又叫二叉排序树,二叉查找树,是一种特殊的树型结构,它有如下特点。 任一节点的左(右)子树中,所有节点(若存在)均不大于(不小于)r。我们把这种特点叫做顺序性。 二叉搜索树的数据结构: 1 struct node 2 {
阅读全文
C语言 位运算操作集合
摘要:位运算是一种基于整数二进制表示的运算,使用位运算在一些情况下可以有效提高算法效率。这篇博客主要对位运算进行总结,收集一些常用的位运算操作,并介绍几道例题。 基本的位运算分为六种,分别是按位与,按位或,按位异或,按位取反,左移,右移。 与,或,异或 这三个运算符都是涉及两个数的运算符。它们的作用可以通
阅读全文
串匹配算法——KMP算法
摘要:上一篇博客介绍了串匹配问题的定义和蛮力(Brute Force)算法的实现,并且通过分析得出,在最好的情况下,执行一次蛮力算法的时间,是文本串T长度n和模式串P长度m的乘积,即它的最坏时间复杂度为O(nm)。不难想象,当文本串很长时,运行蛮力算法的时间成本相当高。那么,有没有办法能优化串匹配算法,来
阅读全文
串匹配算法——BF算法
摘要:串匹配问题: 串模式匹配,简称串匹配,是数据结构中的经典问题,在邓俊辉版数据结构中,他的定义如下: 对基于同一字符表的任何文本串T(|T| = n)和模式串P(|P| = m),判定T中是否存在某一子串与P相同,若存在(匹配),则报告该子串在T中的起始位置。 一般来说文本串T的长度n要远大于模式串P
阅读全文
希尔排序
摘要:希尔排序 希尔排序是简单插入排序的拓展,以发明人shell的名字来命名。希尔排序和快速排序一样,是突破了O(n2)界限的排序算法。 希尔排序对简单插入排序的改进 希尔排序主要针对简单插入排序插入过程中移动速度过慢的缺点进行改进。对于简单插入排序来说,序列中逆序的元素越多,则算法需要比较和移动的次数越
阅读全文
排序算法及三大简单排序算法介绍
摘要:排序是数据结构与算法中不可绕过的部分。所谓的排序,就是按照某种约定的比较规则,将一个序列排成某种顺序。例如将n个整数
a1,a2,...,an按大小顺序排成一个非降序列,使
a1<=a2...<=an。 排序就是让序列从无序到有序的操作。 排序算法的分类 可以将排
阅读全文
堆排序
摘要:堆的定义 简单来说,堆就是一种有特定约束的完全二叉树。堆要求堆中所有父节点的值大于等于其左右孩子的值,或者小于等于左右孩子的值。前一种被称为大顶堆,后一种被称为小顶堆。 建堆和调整 因为是完全二叉树,可以用数组存储堆这种数据结构,那么我们要怎么样将一个数组中的元素成一个堆呢?其实很简单,只要对每个非
阅读全文
快速排序
摘要:快速排序 之前的文章介绍过冒泡算法。在每一轮冒泡排序中,无序序列通过元素间的不断的交换,使无序集合中最大或最小的元素不断沉底,最后这个元素就变成了有序序列的第一个元素。冒泡算法的思想是非常朴素,它的时间复杂度为O(n2),这不能满足速度上的要求。所以有人就想到了优化这个算法的办法,也就这篇文章要介绍
阅读全文
归并排序
摘要:归并排序 归并排序和快速排序一样,也是一种通过分治思想来提升排序速度的高效排序算法。归并排序采用这样一种策略,将待排序的序列分为两部分,这两个部分分别进行排序。排序完成时,这两部分都是有序的,然后再依次比较这两个序列中元素的大小,将这些元素插入到新的序列当中,这个新的序列就是最终排序结果。 两个有序
阅读全文
最小生成树之Prim算法和Kruskal算法
摘要:要了解最小生成树的概念,我们首先要知道生成树是什么 生成树的定义 一个有 n 个结点的联通图的生成树是原图的极小连通子图,生成树包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树的性质 1.容易想象,要保证n个节点联通,至少要有n-1条边,所以一个有n个节点的生成树必有n-1条边
阅读全文
蓝桥杯——两道并查集的题目
摘要:1. 合根植物 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
阅读全文
并查集
摘要:并查集定义 并查集是一种用来处理不相交集合的树状数据结构。 用途 顾名思义,并查集主要有两个作用 1.并: 合并不相交的集合 2.查::查找集合的代表元素,用来检测集合是否相交。 一些非常常见的算法,如最小生成树,最近公共祖先等,都用到了并查集。 代表元 代表元是集合中用来代表整个集合某个原始,例如
阅读全文
余数定理
摘要:三大余数定理 1. 余数的加法定理 x和y之和除以z的余数,等于x除以z的余数加y除以z的余数再除以z的余数。
(x+y)%z=(x%z+y%z)%z 2. 余数的乘法定理 x和y之积除以z的余数
阅读全文
快速幂
摘要:传统幂运算 幂运算应该说是一种很简单的运算,在计算机中,可以通过循环手段实现。要计算
nm,需要进行m-1次乘法运算,所以时间复杂度为O(m)。 1 #include <iostream> 2 #define LL long long 3 using namespace std; 4 5 LL
阅读全文