随笔分类 - 基础算法与数据结构
摘要:还是区间求和问题 线段树 时间复杂度 建树 查询区间 更新区间 参开资料 还是区间求和问题 对于单点修改,区间求和问题,我们可以用树状数组很好地解决。但是如果需要对区间进行修改(统一加上一个值),然后区间求和这种问题,那么就需要线段树了。 线段树 线段树是一颗二叉树(近似于完全二叉树),线段树的每一
阅读全文
摘要:求区间和的问题 树状数组 代码示例(go) 参考资料 求区间和的问题 当前有一个包含n个元素的数组arr[n],需要不断地修改其中某一元素的值,以及查询某一区间的和。 最为原始的做法就是直接修改值,然后遍历求和,那么修改的时间复杂度就是$O(1)$,查询的时间复杂度就是$O(n)$。 或者采用前缀和
阅读全文
摘要:结构定义 操作定义 合并 插入 删除 复杂度分析 代码示例 参考资料 结构定义 斜堆(skew heap)也叫自适应堆(self-adjusting heap),它是左倾堆的一个变种。通常用来实现优先队列,支持插入,删除,合并操作,并且均摊复杂度都为$O(lgn)$。 斜堆在结构上没什么特殊要求,只
阅读全文
摘要:红黑树性质 红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位用来表示结点颜色,可以是Red或者Black。通过对任意一条从根到叶子的简单路径上各个结点颜色的约束,红黑树可以确保没有一条路径会比其它路径长出2倍,因而是近似于平衡的。 红黑树满足下面的性质: 每个结点要么是红色的,要么是黑色的。
阅读全文
摘要:最大子序列和 给定一个整数数组$A[1\cdots n]$,找到一个具有最大和的连续子数组,返回其和: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组[4,-1,2,1]的和最大,为6 动态规划解法 令$d[i]$表示以$A[i]$结尾的最大子序列和,若$d[
阅读全文
摘要:拓扑排序 对于一个有向无环图(DAG Directed Acyclic Graph)——$G(V,E)$来说,其拓扑排序是G中所有结点的一种线性次序,该次序满足如下条件:若图$G$包含边$(u,v)$,则结点$u$排在结点$v$前面,若图$G$中包含环路,则不可能排出一种线性次序。 举个栗子 在实际
阅读全文
摘要:算法描述 快速排序采用了分治的思想: **分解:**数组$A[p\ldots r]$被划分为两个子数组$A[p\ldots q-1]$和$A[q+1\ldots r]$,使得$A[p\ldots q-1]$中的元素小于等于$A[q]$,$A[q+1\ldots r]$中的元素大于等于$A[q]$ *
阅读全文
摘要:堆(heap) (二叉)堆是一种用数组表示的完全二叉树,并且任意节点满足$A[PARENT(i)]\geq A[i]$的大小关系(最大堆): 完全二叉树:对于高度为h的二叉树,除了h层以外,其余0到h-1层的节点都是满的,且h层的节点都靠左边。 完全二叉树高度:对于n个节点的完全二叉树,高度为$\l
阅读全文
摘要:算法描述 插入排序的过程和平时打牌的时候给手里的牌排序差不多: 从牌桌上抽一张牌 把抽到的牌从右到左(或者从左到右)挨个和手里的牌进行比较,当发现左边的牌大一些,右边的牌小一些,就将牌插入到该位置 重复执行步骤1,直到牌抽完了 参考动画:visualgo.net 代码实现(C++) #include
阅读全文