算法导论
Salmon_lee
这个作者很懒,什么都没留下…
展开
-
快排两种实现及五种优化
快速排序是一个优秀的排序算法,O(n²)和Ω(nlgn),期望运行时间:θ(nlgn)且常数因子较小。快排运用了分治的思想:分:将数组划分成两部分(核心,partition)治:递归地对划分地两个子数组进行排序合并:无需合并,因为快排是直接在数组内部进行元素交换的 以下给出Partition的几种实现方法和优化方法:【实现一】(标准版)①选取首元素或尾元素为主元(p...原创 2018-03-06 20:31:58 · 1886 阅读 · 0 评论 -
《算法导论》第9章:顺序统计、中值
本章主要解决的问题:求数列中第i小的元素一、排序+下标定位【最坏情况Θ(n*lgn)】 二、随机化分治算法【平均情况Θ(n)】算法步骤1.随机选择主元2.线性时间内以主元划分为两部分,左半部分小于主元,右半部分大于主元。设主元的下标为k。3.根据情况选择:if k == i:直接返回A[k]if k > i:递归最半部分找第i小的数if k <...原创 2018-08-12 22:27:38 · 1057 阅读 · 0 评论 -
OS树和区间树
动态数据统计:顺序统计树(Order-statistic tree)数据结构:红黑树+每个结点保存子树的大小基本操作:OS_SELECT(x,i) r = size[left[x]]+1; //先计算x的处于的位置 if i = r //x正好是第i小的关键字 then return x; else if i < r ...原创 2018-08-18 02:05:19 · 837 阅读 · 0 评论 -
平衡搜索树之红黑树
五种平衡搜索树• AVL trees• 2-3 trees• 2-3-4 trees• B-trees• Red-black trees红黑树的性质1. 每个结点都是红/黑的2. 根结点和叶结点是黑色的3. 红色结点的parent是黑色的4. 简单路径的黑色结点个数相同(黑高bk)红黑树的树高将红色结点都合并到黑色结点中(2,3,4-tree),则由性质3...原创 2018-08-15 21:11:00 · 158 阅读 · 0 评论 -
算法导论第21章:并查集
算法分析的一个约定MAKE-SET的次数为nMAKE-SET、FIND-SET、UNION的总次数为m不相交数据集合的链表实现链表表示一个集合,结点表示一个元素。每个结点都有指向头节点的指针,头结点指向集合的代表元。MAKE-SET(x):创建一个只有一个结点的链表【O(1)】FIND-SET(x):元素的结点指向头节点,再指向代表元 【O(1)】UNION(x,...原创 2018-08-27 20:31:36 · 1588 阅读 · 0 评论 -
算法导论第23章:最小生成树
引理如果将图G切割成G1、G2,图G的最小生成树 = G1的最小生成树 + G2的最小生成树 + 连接G1、G2权重最小的边。Kruskal’s Algorithm步骤:①分别对|V|个结点MAKE-SET②对E按升序排序③选择最短的一条边e(x, y),若FIND-SET(x) != FIND-SET(y),则加入树边的集合时间分析:①③花费O((V+E)α...原创 2018-08-27 22:48:15 · 606 阅读 · 0 评论 -
算法导论第22章:基本的图算法
目录图的表示特殊的图图的遍历拓扑排序(Topological Sort)强连通分量(Strongly Connected Components)欧拉回路(Eulerian Circuit)题选图的表示1.邻接矩阵(Adjacency Matrix)2.邻接链表(Adjacency List)3.完善邻接链表(Implementing Adjacency...原创 2018-08-24 18:53:17 · 1795 阅读 · 0 评论 -
算法导论第21章思考题
脱机最小值(off-line minimum problem)输入给定一个操作序列,包括INSERT(x)和EXTRACT-MIN,操作数x∈[1,n]样例输入4,8,E,3,E,9,2,E,E输出将第i次EXTRACT-MIN的数保存在extract[i]中在线算法建立一个优先队列,给定一个操作,马上在优先队列中做出相应改变即可离线算法(off-line)...原创 2018-08-29 16:52:34 · 1255 阅读 · 0 评论 -
算法导论第24章:单源最短路径
目录Bellman-Ford算法有向有负环图有向有非负环图(练习24.1-3)找到负环上的所有结点(练习24.1-6)DAG中的单源最短路径问题有向无环图S到V的路径总数(练习24.2-4)Dijkstra算法有向无负权图Bellman-Ford算法有向有负环图算法:对所有E松弛V-1次,若还存在可松弛的结点,说明存在负环运行时间:O(VE)...原创 2018-09-02 16:02:44 · 2263 阅读 · 0 评论 -
差分约束与最短路径
差分约束问题(Difference constraints)一类特殊的线性规划(Linear Program)问题,例如求一个可行n维解向量X,使得其满足以下m个式子:利用“最短路径”解决差分约束问题①建立一个图,包含n个结点,m条边;且对Xj - Xi ≤ Wij,edge(Vi, Vj) = Wij②增加结点V0,从V0出发引入n条权重为0的边链接到各个原有结点③...原创 2018-10-06 17:48:13 · 955 阅读 · 1 评论 -
算法导论第12章:二叉搜索树
基本性质左子树 < 根 < 右子树基本操作 O(logn)1.查找最大、最小关键字元素根据二叉树的基本性质,向左子树或右子树递归即可2.查找前驱和后继查找结点X的后继Y分为两种情况:①右结点存在,即只需要找到右子树中最小的元素就好了②右结点不存在,此时就要向亲代查找,直到找到右上方的亲代,此时Y是X的最底层祖先,且Y的左孩子是X的一个祖先。3...原创 2018-11-10 17:19:24 · 386 阅读 · 0 评论 -
超越函数e^(-x^2)的定积分
∫e^(-x^2)dx 是超越积分(不可积积分),它的原函数是非常规的可求其定积分:--------------------- 作者:SethChai 来源:CSDN 原文:https://blog.csdn.net/a493823882/article/details/81000079...转载 2018-11-13 21:59:13 · 71525 阅读 · 1 评论 -
《算法导论》:跳跃表(Skip List)
跳跃表简介 Skip lists are data structures that use probabilistic balancing rather than strictly enforced balancing. As a result, the algorithms for insertion and deletion in skip lists are much...原创 2019-02-03 00:06:08 · 1328 阅读 · 0 评论 -
《算法导论》第17章:摊还分析(Amortized analysis)
基本概念在摊还分析中,我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价,可以保证最坏情况下每个操作的平均性能。本文,我们将以“栈操作”为例来讲解三种摊还分析方法。“栈操作”描述push(s, x):将对象x压入栈S中。pop(s):将栈S的栈顶对象弹出,并返回该对象。对空栈调用pop会产生一个错误。multipop(s, k):循环调用pop...原创 2019-02-09 00:33:19 · 1839 阅读 · 0 评论 -
《算法导论》第11章:散列表
一、直接寻址表类似于计数数组,表中每一个槽只能放一个指针,一旦发生冲突无法解决二、哈希表的链接法每个槽保存一个链表,若是双链表可以方便删除效率分析:一次不成功查找的平均时间为θ(1+α),其中α=n/m称为装载因子。因此当槽的个数m为n的常数倍时,可以认为一次哈希操作耗费O(1)的时间哈希函数除法【形式简单】:h(k)=k%m,其中m不能取2^n,否则相当于取k的后n位数...原创 2018-08-04 19:34:55 · 294 阅读 · 0 评论 -
快速排序复杂度的分析
这里仅仅简要描述两种方法:【方法一】(关注点:两个元素是否进行比较)设Aj...Ak为一个有序数列,则在待排数列中Aj与Ak进行比较与Aj或Ak作为主元等价。然后双重求和即可得到θ(nlgn)【方法二】(关注点:每次单独递归调用的时间)E[T(n)]=E[ ∑q=1nXq(T(q−1)+T(n−q)+Θ(n))] 其中Xq为指示性随机变量,代表第q小的数被选为主元的概率,即Xq==1/n==...原创 2018-03-06 20:44:02 · 321 阅读 · 0 评论 -
随机置乱算法
【正解】高纳德置乱算法(Knuth-Fisher-Yates algorithm)准确性:这个算法是无偏的,即每个排列都是等可能的效率:时间复杂度Θ(n),无需额外空间(基于交换元素)伪代码:int a[n]for i from n-1 to 1 get a random_integer j (0≤j≤i) swap a[i] with a[j]end以下是C++实现方法:①使用STL...原创 2018-02-22 13:24:42 · 3822 阅读 · 0 评论 -
《算法导论》第2章:算法基础
学习内容:①算法(尤其是递归算法)复杂度的计算方法②证明算法正确性的三个步骤 //虽然我没有怎么弄清楚③几个排序算法的实现与比较代码:插入排序:#include <iostream>using namespace std;int a[6] = {4,3,6,1,2,5};int main(){ int i,j,key; for(j=1; j<...原创 2018-02-09 19:44:09 · 228 阅读 · 0 评论 -
分治法实例:斐波那契数列
我们都十分熟悉斐波那契数列的定义:Fn = Fn-1 + Fn-2,其中F0 = 0、F1 = 1。那么我们如何求解斐波那契数列的某个特定项呢?方法一:递归求解。这种方法看似简单,可是实际上我们会重复计算许多已经计算过的项,最后递归树竟然是一棵完全二叉树,时间复杂度达到了Θ(φ^n),其中φ = (sqrt(5)+1)/2。我们不再讨论此方案。方法二:递推求解。即利用Fn的定义式,以线性的复杂度O...原创 2018-02-16 21:20:23 · 6101 阅读 · 2 评论 -
分治法实例:快速幂
快速幂:即快速求幂a^b,这里提供两种实现方法:①位运算非递归实现法即将幂次b写成二进制的形式(事实上,计算机中就是以二进制保存数字的),若b的某个二进制位为1,res乘上当前的base,同时base变成base²;若为0,则仅仅base变为base²。②递归实现法这种方法貌似更好理解一些,若b为偶数,则a^b = [a^(b/2)]^2;若b为偶数,则a^b = a * [a^(b/2)]^2。...原创 2018-02-16 20:59:43 · 978 阅读 · 0 评论 -
分治法实例:折半查找
折半查找法:对于一个有序的数列,折半查找一个元素的位置;效率:O(lgn);代码说明:①如果未找到元素a.若比所有元素小, 返回位置0b.比所有元素大,返回最后一个位置c.介于所有元素之间,返回比其大的紧邻元素的位置;#include <iostream>using namespace std;int a[8] = {1,2,3,5,6,7,8,9};int binaryFi...原创 2018-02-16 20:49:18 · 1015 阅读 · 0 评论 -
最大子数组问题的三种解法
最大子数组问题:在一个数列当中寻找一个子数列,使得这个子数列的元素之和最大。为了使代码简单化,在这里我们只求出最大值。①暴力搜索,即在C(n,2)种可能的方法中寻找符合题意得一种,显然时间复杂度为θ(n²);#include <iostream>#include <climits>using namespace std;int a[16] = {13,-3,-25,...原创 2018-02-16 20:40:39 · 7206 阅读 · 2 评论 -
《算法导论》第4章:递归分析
本章共介绍了3种方法来求解递归式的时间复杂度。方法一:代换法(猜测+证明)即猜出Tn的复杂度后,代入原来的式子进行检验。如:Tn = 2T(n/2)+n 中:①猜测Tn = O(n*lgn),即Tn≤c*n*lgn;②然后证明2T(n/2)+n≤c*nlgn即可,其中T(n/2)=c*(n/2)*lg(n/2)。方法二:递归树按式子迭代出一棵树之后,将每一层的和累...原创 2018-02-15 22:51:57 · 1033 阅读 · 0 评论 -
《算法导论》第3章:函数的增长
这章主要展现了一些基本函数的知识,引入了渐进记号的概念。一些陌生的知识点:①lg* x:就是“劳格”i次得到一个小于等于1的数;②Stiring公式:n! ≈ sqrt(2πn)*(n/e)^nn! = o(n^n),n! = w(2^n),lg(n!) = θ(lg(n^n));③斐波那契数列的Fi为Φ^i/sqrt(5)舍入到最近的整数,其中Φ为x²-x-1=0的正根;④取整函数的有关性质(p...原创 2018-02-11 22:07:35 · 302 阅读 · 0 评论 -
堆的应用
【堆排序】维护堆的性质(heapify):从某一结点递归地维护堆;T(n) ≤ T(2n/3) + Θ(1) --- O(lgn)建堆(build-heap):循环维护结点 n/2 downto 1,∑(T(k)*lgk) --- O(n)堆排序(heap-sort):交换堆顶元素和末尾元素,堆尺寸-1,维护堆顶结点。 --- O(nlgn)C++STL(sort-heap)实现:#include...原创 2018-03-01 17:32:17 · 172 阅读 · 0 评论 -
线性时间排序
【决策树模型】用处:证明基于比较的排序的时间复杂度为Ω(nlgn)简单描述:二叉树,有n!个叶节点,则此树在最茂盛的时候有最小的高度H = lg(n!) = Ω(nlgn),因此至少需要nlgn次比较【计数排序】描述:对n个位于区间[0,k]的元素进行排序,复杂度为O(n+k)的稳定排序C++11代码:#include <iostream>#include <vector>...原创 2018-03-11 14:51:19 · 230 阅读 · 0 评论 -
O(V)时间利用关联矩阵求通用汇点
通用汇点:有向图中入度 = |V| - 1,出度 = 0的点。即所有点都汇集到一个通用汇点。关联矩阵(用M表示)示例:其中D为通用汇点 A B C D EA 1 0 1 1 1B 0 1 1 1 0C 1 0 0 1 0D 0 0 0 0 0E 0 0 1 1 0问题:如何在O(V)的时间下判断一个有向图是否存在通用汇点?算法:①取两个游标i=1,j=1。②若M[i][j]=1,则i++。此时...原创 2018-05-15 10:05:35 · 422 阅读 · 0 评论 -
《算法导论》BFS和DFS
说明:BFS的图来自《算法导论》22-2;DFS的图来自《算法导论》22-4;C++11代码如下:一、BFS#include <iostream>#include <vector>#include <queue>#include <forward_list>using namespace std;struct V //顶点{ i...原创 2018-06-11 12:46:00 · 654 阅读 · 0 评论 -
《算法导论》:竞争性分析、自组织表
自组织表(Self-Organizing List)两种基本操作access(x):访问元素x,时间复杂度与x在表中的位置即rank(x)成正相关。transpose(x):交换x和x的前驱,时间复杂度为O(1)。两种算法在线算法:必须立即完成这步操作,无法预知后续操作。离线算法(上帝算法):离线算法可以假设可以预读整个序列,从而可以对整个操作序列做优化。算法分析...原创 2019-02-10 16:34:23 · 1454 阅读 · 0 评论