![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
无
Kiddyup
这个作者很懒,什么都没留下…
展开
-
lowbit操作
lowbit操作应用求得二进制的最后一个1证明假设x为_ _ _ _ _ 1 0 0 0 0则:~x(x取反)为_ _ _ _ _ 0 1 1 1 1~x+1为_ _ _ _ _ 1 0 0 0 0那么可以通过x&~x+1获得最后一个1(注意:在编程中-x即为~x+1)所以x&-x与x&~x+1等价模板int lowbit (int x){ return x & -x;}...原创 2021-06-06 00:08:05 · 163 阅读 · 0 评论 -
数据结构:单调栈
单调栈应用场景给定一个序列求序列中的每个元素的离它左边最近且比这个数小的数。同理(以下均适用):给定一个序列求序列中的每个元素的离它左边最近且比这个数大的数。给定一个序列求序列中的每个元素的离它右边最近且比这个数小的数。给定一个序列求序列中的每个元素的离它右边最近且比这个数大的数。证明栈是单调的以(给定一个序列求序列中的每个元素的离它左边最近且比这个数小的数。)为例给定一个序列a假设:下标x<i 且 x+2<i如果:a[x]>=a[x+2]那么a[x]一定可以被a[原创 2021-06-05 23:53:27 · 126 阅读 · 0 评论 -
最小生成树(prim以及kruskal)
最小生成树概念:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。构造方法:普里姆(prim)和克鲁斯卡尔(kruskal)普里姆(Prim)时间复杂度(O(n2))基本思路及过程:在一个加权连通图中,创建两个集合:顶点集V和边集E,另外还需访问标志数组visit。在所有点中任意选出一个点作为初始点,并将该点的visit标记为true,接着计算所有与该点相连接的点的距离,找到与之距离最短的点,标记visit为tru原创 2020-09-11 09:45:04 · 198 阅读 · 0 评论 -
实现二叉树的基本操作
具体实现的算法:(1)构建二叉树(2)前序、中序、后序遍历二叉树(3)层次遍历二叉树(4)求二叉树的最大宽度(5)求二叉树的叶子结点个数(6)交换每个结点的左右子树(7)求二叉树的深度代码:#include <iostream>#include <algorithm>#include <cstring>#include <queue>using namespace std;typedef struct BiTNode {原创 2020-09-09 23:01:22 · 1402 阅读 · 0 评论 -
哈夫曼(Huffman)树的基本概念,构造算法以及哈夫曼编码
哈夫曼树的基本概念哈夫曼树: 假设有m个权值{w1,w2,···,wm},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或者哈夫曼树。WPL(树的带权路径长度):所有叶子结点的权乘上到根节点的距离的总和。例子:四个叶子结点a b c d,分别带权 6 3 4 2,则构建哈夫曼树如图: &nb原创 2020-09-08 18:51:34 · 2043 阅读 · 1 评论 -
三种常用排序代码模板(含时间复杂度)
冒泡排序时间复杂度:O(n2)代码:#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1010;void bubble_sort(int a[],int len) //核心代码{ for(int i = 0;i < len - 1;i++) for(int j = 0;j < len -原创 2020-09-02 21:59:48 · 241 阅读 · 0 评论 -
前缀和&差分(一维与二维)
前缀和概念:用一个数组存储已知序列从第1位到第i(i :1~n)位的值。作用:解决问题的一种预处理方法,可以快速的求出序列中某一段的和。一维前缀和基本操作:(1)计算前缀和:s[i] = s[i-1] + a[i](s[i]表示前缀和,a[i]表示原序列)(2)计算中间的一段值:ans = s[r] - s[l-1]代码 for(int i = 1;i <= n;i++) // 计算前缀和 { cin >> a[i]; s[i] =原创 2020-08-30 23:41:29 · 286 阅读 · 0 评论 -
并查集 以及 并查集优化
什么是并查集并查集:主要用于不相交集合的合并与查询。(如判断两个元素是否在同一集合中)并查集主要操作定义数组f[n],表示当前下标 i 所在的集合的祖先(树根)初始化(拿1~10为例)每个元素所在集合都只有本身,即每个元素都是树根。查找查找元素所在集合的根节点。合并...原创 2020-07-30 22:40:33 · 1157 阅读 · 0 评论 -
数据结构和算法 堆排序 (图解堆调整)
什么是堆?堆:是一种特殊的序列 并且 将该序列想象为 完全二叉树元素满足:(ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 (孙子不一定) 这种堆称为 最小化堆(小堆) (树根是最小的)(ki >= k2i && ki >= k2i+1) 每个点一定比它的左右孩子大 (孙子不一定)这种堆称为 最大化堆(大堆) (树根是最大的)堆排序(以最大化堆为例)堆调整:排序之前需要将序列调整为 堆 (原创 2020-05-25 22:11:24 · 7924 阅读 · 4 评论