算法分析
文章平均质量分 53
z-k
这个作者很懒,什么都没留下…
展开
-
最近点对问题之蛮力法、无内部排序分治法、有内部排序分治法
#include <iostream>#include <vector>#include <algorithm>#include <string>#include <stdlib.h>#include <math.h>#include <time.h>#include <windows原创 2018-10-14 17:43:16 · 205 阅读 · 0 评论 -
N皇后递归法和回溯法实现
设计了一个类构造函数就是构建N皇后的棋盘状态有2个函数是递归法的求解有2个函数是迭代法的求解有1个函数是输出解的个数详细见注释#include <iostream>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;class...原创 2019-04-17 18:00:02 · 342 阅读 · 0 评论 -
快速排序标准写法
以下是参照《算法导论》上的伪代码写出的可运行的快排#include <iostream>#include <vector>#include <algorithm>using namespace std;//枢纽元,返回一个位置,此位置左边的数都小于它,右边的数都大于它int part(vector<int> &nums, in...原创 2019-03-27 16:40:04 · 1013 阅读 · 0 评论 -
最大流问题之FF算法与EK算法
目录问题描述:EK算法:算法描述:伪代码:例子:控制台对应输出为:关键定理证明:最大流最小割定理:1推2:2推3:3推1:时间复杂度分析分析关键边定义:时间复杂度计算:FF算法:FF算法介绍FF算法缺陷分析:问题描述:G=(V,E)是一个有向图,其中每条边(u,v)有一个非负的容量值c(u,v),而且如果E中包含一条边...原创 2019-01-30 19:32:26 · 6360 阅读 · 0 评论 -
N皇后-动态输出回溯过程
效果: 代码:#include <iostream>#include <math.h>#include <stdlib.h>#include <vector>using namespace std;class Queen{private: int n=4; //棋盘大小 vec...原创 2018-12-28 15:02:05 · 783 阅读 · 0 评论 -
主定理(递归式分析)
上图来自《算法导论》其意思为:令a≥1,b>1都是常数,f(n)是一个函数T(n)是定义在非负整数上的递推式:1、对某个常数,有,则2、若,则3、对某个常数,有 且对某个常数c<1和所有足够大的n有,则 下面举一个例子:有a=9,b=3,f(n)=n因此由于,其中由主定理的情况1可直接得:...原创 2018-12-27 22:41:00 · 14648 阅读 · 2 评论 -
Tarjan算法求桥
桥的定义:在图论中,一条边被称为“桥”代表这条边一旦被删除,这张图的连通块数量会增加。等价地说,一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥。理论:从某个顶点开始进行DFS,并按访问先后顺序进行标号如果某个结点的某条边的DFS中有某个孩子的边指向了这个结点或这个结点的祖先,那么这条边不为桥,反之则为桥如上图,顶点1的孩子结点中,有顶点3的绿色边指向了顶点...原创 2018-12-27 22:20:15 · 3193 阅读 · 0 评论 -
Kruskal算法的改进(基于Tarjan算法)(个人想法)
正常的kruskal算法如下:对应的步骤为(数字对应上图步骤):1、初始化生成树的边集A为空集2、对集合中的每一个顶点,都将它的集合初始化为自身4、将边按权值进行排序5、对排序好后的边从小到大进行判断,如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合做一个Union操作,如此循环加到生成树中的边集数量为n-1时停...原创 2018-12-27 22:01:01 · 968 阅读 · 0 评论 -
标准Kruskal算法及时间复杂度分析
kruskal算法的标准实现方法是基于并查集的以下是《算法导论》上kruskal算法的伪代码翻译一下:(数字对应上图行号)1、初始化生成树的边集A为空集2、对集合中的每一个顶点,都将它的集合初始化为自身4、将边按权值进行排序5、对排序好后的边从小到大进行判断:如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合做...原创 2018-12-27 21:38:57 · 36145 阅读 · 1 评论 -
动态规划解最长公共子序列(LCS)(附详细填表过程)
目录相关概念子序列形式化定义:公共子序列定义:最长公共子序列(以下简称LCS):方法蛮力法求解最长公共子序列:动态规划求解最长公共子序列:分析规律:做法:伪代码:下面演示下c数组的填表过程:(以求ABCB和BDCA的LCS长度为例):时间复杂度:代码:结果示例:相关概念子序列形式化定义:给定一个序列X=<x1,x2,x3,x...原创 2018-11-20 12:51:34 · 157745 阅读 · 99 评论 -
回溯法解N皇后问题
设计:用一个一维x数组代表N皇后第n行旗子所放置的位置,比如说x[i] = j代表第i+1行放置的位置是第j+1个格子从第一行开始,将旗子从第一个位置放起,放下后判断其是否合法:如果合法,继续放下一行,直到超出棋盘大小为止如果不合法,则继续放这一行的下一个位置,继续判断是否合法最后,如果放置的行数超过棋盘规格,证明前面n行的放置都是合法的,表示已经找到了一个解了代码:...原创 2018-11-20 00:18:32 · 538 阅读 · 0 评论 -
回溯法消消乐
目录问题描述一、无剪枝回溯设计二、剪枝设计参数准备:剪枝判断:三、剪枝设计优缺点分析缺点:优点:四、数据分析五、剪枝优化:参数可控六、问题最大规模七、K、M、N、X分析K(交换元素的种类):M、N(数据规模):X(交换步数):八、剪枝缺点改进:预测参数问题描述1、在消消乐中如何计算出最大得分(假设消掉之后不会再补充)2、分...原创 2019-01-31 16:37:17 · 7434 阅读 · 0 评论 -
最近点对问题平均时间复杂度为O(n)的解法
在算法导论中给出的方法:分治过程中同时进行归并排序的分治法,它是分治求最短距离的时候同时对左子集和右子集进行归并归并,最终复杂度为T(n) = 2T(n/2) + O(n) = O(nlogn)然而,按照《数据结构与算法》黑皮书280页的描述,取d=min(d1,d2),那么在mid_x±d区间中平均有个点那么我们直接对这个区间中的点进行快速排序,再遍历排序后的点计算每一个点和最近6个...原创 2018-10-17 00:26:03 · 3108 阅读 · 3 评论 -
五种排序算法
一:插入排序二:选择排序三:冒泡排序四:归并排序五:快速排序 #include <iostream>#include<vector>#include<algorithm>#include<string>#include<windows.h>#include<sys\timeb.h>usin...原创 2018-10-10 00:19:22 · 214 阅读 · 0 评论 -
最近点对问题
法一:蛮力法法二:分治法 #include <iostream>#include <vector>#include <algorithm>#include <string>#include <stdlib.h>#include <math.h>#include <time.h>#incl原创 2018-10-10 00:17:39 · 229 阅读 · 0 评论 -
无向图求桥的几种方法(无重边)
目录前言:法一:计算连通分量的基准法描述:时间复杂度分析:数据:法二:找结点基准法描述:时间复杂度分析:数据:法三:并查集描述:按秩合并:路径压缩:时间复杂度分析:数据:法四:生成树筛边基准法描述:时间复杂度分析:数据:法五:生成树筛边并查集描述:时间复杂度分析:数据:法六、Tarjan算法描述:...原创 2019-04-24 17:59:41 · 7638 阅读 · 6 评论