算法
文章平均质量分 75
WayToAccept
这个作者很懒,什么都没留下…
展开
-
强联通分量-kosaraju
kosaraju算法思想:利用了这个特点:如果原图中u,v同属于一个强联通分量,则逆图(原图所有的边反向)u,v同属于一个强联通分量。1.DFS原图按照DFS返回的时间记录节点的访问顺序time[t].2.每次从time[]选择离开最晚的节点,在逆图中进行DFS,该节点能遍历到的节点位于同一强联通分量,并删除逆图中这些节点。3.直到time[]中没有节点。下面是两种不同存储结构的实原创 2015-11-04 21:49:20 · 609 阅读 · 0 评论 -
蚁群算法解TSP问题
代码来源于博客http://blog.sina.com.cn/s/blog_6bb1b4b001016pt0.html添加了部分注释,几乎没有改动(参数和城市格式略做改动),原博主的代码写的很容易理解,也是我找到的最短的代码了,在此感谢。如果没有接触过蚁群算法,请先阅读http://download.csdn.net/detail/waytoaccept/9493547 这本书介绍的比转载 2016-04-17 12:01:47 · 5130 阅读 · 4 评论 -
遗传算法求解TSP问题
遗传算法是一种启发式搜索,属于进化算法的一种。它最初是人们根据自然界对物种的自然选择和遗传规律而设计的。它模拟自然界物种的自然选择、遗传和变异等,对一个种群的基因进行改良。遗传算法需要设置交叉概率、变异概率和迭代次数等参数,且算法的收敛性受其参数设置影响较大。遗传算法中把每一个候选解看做是一个个体,个体组成的集合看作是一个种群。遗传算法通过对每个解进行二进制编码把每个解转化为0-1字符串,其中每一原创 2016-06-07 09:06:18 · 21364 阅读 · 0 评论 -
粒子群算法认识
7月没写博客,欠了好几篇了。看到一个关于粒子群算法介绍的文章,写的通俗易懂,博主肯定也是花了一定心血,进行了大量实验,“吃水不忘挖井人”在此表示感谢。先贴上链接(以备后查),等有时间了写一写代码。1.粒子群算法简介http://blog.csdn.net/niuyongjie/article/details/15696712.标准的粒子群算法http://blo转载 2016-08-23 16:52:32 · 1098 阅读 · 2 评论 -
遗传算法解一道笔试题
题目大意如下:有N个房间,通过N-1个门相连(每个房间的门数在1到3之间),现在有M个路由器,需要把M个路由器放置在其中一些房间中,使得放置路由和其周围的房间能收到wifi信号(假如一个房间放置了路由器,只有它自己以及与它相邻的房间可以收到它的信号)。每个房间都有一个满意度,如果 该房间可以收到WiFi信号则,总的满意度就会累加上该房间的满意度。现在问,怎样放置M个路由器使得总满意度最大。原创 2016-10-18 09:52:04 · 1154 阅读 · 0 评论 -
快速排序
快速排序是经常用到的一段代码,据说是最有影响力的10大算法(未考证)说到排序,我们数一下常见的一共有几种:冒泡、选择、插入、希尔、快排、堆排、索引、桶排其实还有一个中位数的中位数排序(名字记不得了)时间复杂度:快排在评均的情况下nlog(n),最坏n^2原理呢:采用分治策略,先选出一个元素,然后以此为基准,比它小的放左边,比它大的放右边,这样把区间划分成左右两部分(跟它一样原创 2016-10-04 11:24:40 · 429 阅读 · 0 评论 -
最大熵与EM算法
这两个算法在李航的《统计学习方法》的推导不是很容易理解,特找到一下博客,配合书进行理解。1.最大熵http://www.cnblogs.com/ooon/p/5677098.html(推导过程很清晰,除了最后的结论公式有点小瑕疵:公式应该是 A-B类型,总体写的还是很不错的)2.EM算法http://www.cnblogs.com/bigmoyan/p/455037转载 2017-03-30 14:40:19 · 1835 阅读 · 0 评论 -
树的非递归遍历
1.先序(我只把这些当模板)class Solution {public: vector preorderTraversal(TreeNode* root) { vector res; if(root==NULL)return res; stack ms; TreeNode* p=root; while(原创 2017-06-20 22:27:01 · 359 阅读 · 0 评论 -
背包问题
背包问题分类:0-1背包(每种物品只有一个)完全背包(每种物品无限多)多重背包(每种物品Mi个,0-1背包算是多重背包的特殊情况)混合背包。。。解决此类问题主要将其转化为0-1背包的问题,所以求解0-1背包的转移方程就很重要具体的转化,优化,请参考背包九讲(前人总结的很详细啦)下面的代码是0-1背包的通用代码#include #include #in原创 2017-06-12 11:51:03 · 395 阅读 · 0 评论 -
最长递增子序列
最长递增子序列(递增子序列会了,递减子序列也就没问题了)第一种思路:a[i]在最长子序列的位置为dp[i]dp[i]=max(1,dp[j]+1) s.t. 0第二种思路:对a[i]排序的b[i]求a[i]与b[i]的最长公共子序列第一种思路代码:#include #include #include #include #include #include原创 2017-06-13 03:44:31 · 448 阅读 · 0 评论 -
堆排序-代码版
要说堆排序,首先明白什么是堆:数据结构与算法中的堆是指,一个特殊的满二叉树,对于每个非叶子结点,它总是比它的子节点大(或者小)如果每个节点总是大于其子节点,则称为大根堆如果每个节点总是小于其子节点,则称为小根堆大根堆用于从大到小排序,小根堆用于从小到大排序。堆因为是满二叉树,所以使用数组存储很方便,假定从a[1]的地方开始存储,第i个节点,其左右孩子(假如存在)分别为a[2*i原创 2017-06-11 15:06:40 · 292 阅读 · 0 评论 -
二分图最大匹配
一直以来觉得二分图匹配啥的算法看不懂,直到遇到下边的两篇博客http://blog.jobbole.com/106084/http://blog.csdn.net/hackbuteer1/article/details/7398008模板真的好简单题意描述:农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不转载 2017-08-25 16:50:52 · 285 阅读 · 0 评论 -
快排划分思想的应用-求第k大数或者第k小的数(求前k大数或者前k小的数)
//第k大数,第k小的数--前k大数,k小的数-----------------------------------------------------------------------#include #include #include #include using namespace std;//每次选择第一个元素作为划分点,比它小放左边,比它大放右边int partition原创 2017-08-26 17:32:43 · 811 阅读 · 0 评论 -
模拟退火算法求解TSP
算法思想,模拟物理的退火过程。区别于爬山算法的关键在于,对于比当前差的解,不是直接舍弃,而是以一定的概率接受。(主要框架:三个函数+两个准则)给定初温t=t0,随机产生初始状态s=s0,令k=0; Repeat Repeat 产生新状态sj=Genete(s); if min{1,exp[-(C原创 2016-05-11 21:23:35 · 1210 阅读 · 0 评论 -
约瑟夫问题递归求解
原文http://www.cnblogs.com/txlstars/articles/5400352.html证明过程请参照原文,递推式f[n] = (f[n-1] + k) mod n//伪码搬运工Josephus(N, K): f[1] = 0 For i = 2 .. N f[i] = (f[i - 1] + K) mod i End For转载 2016-04-18 12:17:44 · 614 阅读 · 0 评论 -
强联通分量-tarjan
#include #include#define Node 100using namespace std;struct Edge{ int v,w,next;}edge[Node*Node];int head[Node];int low[Node]; //low[u]表示访问该强联通分量最早的时间int time[Node]; //访问节点的时间顺序,标识是否访问过i原创 2015-11-04 20:28:56 · 681 阅读 · 0 评论 -
强联通分量-Gabow
Gabow与Tarjan的思想相同。Gabow用栈模拟tarjan的low[]数组。算法思想:http://blog.csdn.net/waytoaccept/article/details/49642945#include #include#define Node 100using namespace std;struct Edge{ int v,w,next;原创 2015-11-04 22:10:06 · 667 阅读 · 0 评论 -
最小生成树-Prim
prim算法不断从不在树上的节点中选择代价最小的一个加入树上,与dijkstra算法非常类似。1.初始化.所有节点visit[i]=0,距离dist[i]=MAX,把根root的dist[]置0确保第一次加入树。2.每次选最小代价的节点加入,共选n次2.1遍历dist[i]选择未被访问且代价最小的节点u2.2遍历u的未被访问的邻接点更新dist[i]数组原创 2015-10-28 21:45:43 · 459 阅读 · 0 评论 -
次小生成树
次小生成树算法如果你理解了次短路(第二最短路),那么理解次小生成树就很容易了。同样是利用“不破不立”的思想算法思想1.求原图的最小生成树,保存树的每一条边2.依次删除生成树的每一条边(破),重新计算图的生成树(立),然后把新的生成树代价排序,最小那个就是(可能会与原生成树相同,根据题目要求即可)注:每次计算完新的生成树后,要恢复原图(恢复现场)#include #incl原创 2015-10-28 22:17:54 · 378 阅读 · 0 评论 -
次短路(第二最短路径)
第二最短路径有句古话叫“不破不立”,这个思想跟次短路也就是第二最短路的思想一样。算法思想:计算原图的最短路,并保存路径。一一破坏最短路中的每一条边,重新计算最短路,并排序。最小的那个就是第二最短路。1.用dijkstra计算u->v的最短路径,保存路径上的每条边2.依次删除最短路径上的每一条边(每次删一条),重新计算新的u->v最短路径(新的最短路>=原最短路)3.把所有新原创 2015-10-28 21:27:48 · 6900 阅读 · 1 评论 -
数据结构-链表
链表相关算法:增删改查+创建+销毁#include #includetypedef struct Node{ int data; Node *next;} LNode,*LinkList;//LinkList Operations://Create LinkList At Headvoid CreateLinkAtHead(LinkList &L){原创 2015-10-28 22:26:01 · 825 阅读 · 0 评论 -
最短路-SPFA(Shortest Path Faster Algorithm)
SPFA求单源最短路SPFA是使用了队列优化的单源最短路算法,与Dijkstra不同的是,它可以判断是否图中有负环。它的实现与dijistra很相似,先看一下百度百科上的伪码:ProcedureSPFA;Begin initialize-single-source(G,s); initialize-queue(Q); enqueue(Q,s); whi原创 2015-10-28 20:53:25 · 670 阅读 · 0 评论 -
最短路-Dijkstra算法
与Floyd算法(求任意两点间最短路)不同,Dijkstra可以求单源最短路径(不含负权)算法思想:从源点开始逐个把距离源点最近的点,加入到源点可以最快到达的集合中,直到所有的点都加入进来。1.初始化。令所有点最短路径dist[i]=MAX,访问标记visit[i]=02.令源点dist[s]=0,为了操作的一致性,保证循环第一次选中源点3.每次选一个节点,总共选择n次3.1遍原创 2015-10-28 20:23:29 · 726 阅读 · 0 评论 -
最短路-Floyd算法
Floyd算法思想:1.初始化矩阵(i,j连接则矩阵的值为边的代价,否则为MAX)2.计算 i 经过 k 到 j 的最短路径map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}并保存路径时间复杂度:O(n^3)空间复杂度:O(n^2)原创 2015-10-28 19:35:27 · 603 阅读 · 0 评论 -
算法拾遗
1. KD-Tree使用k维度数据构造的一颗二叉树,主要用途:寻找距离K维空间中一个点最近的点。KD-Tree思想主要是K维空间中模仿二叉排序树,方便进行二分查找。这里有篇写的很6的博客供参考,感谢原作者的奉献。原文地址(有可能打不开):http://www.icvpr.com/kd-tree-tutorial-and-code/转载的文章:http://my.oschina.net/原创 2016-03-04 20:38:45 · 923 阅读 · 0 评论 -
Kruskra算法求最小生成树
//时间复杂度O(elg(e))#include #include#include#include #include using namespace std;/*6 90 1 341 4 120 5 194 5 260 2 462 5 253 5 252 3 173 4 38*///classstruct Edge{ int from ;原创 2016-05-09 12:42:43 · 1541 阅读 · 0 评论 -
那些不得不惊叹的位运算
1. 最简单莫过于用移位实现乘除运算了,置位运算也比较简单 int a=10; a>>=1;//a=5;右移=除法,右移一位除以2; a2. 循环移位8个bit的整形循环左移k位int a=10;//aint b=(a>>k)|(a<<8-k);8个bit的整形循环右移k位int a=129;int c=(a>8-k)原创 2016-04-24 18:17:24 · 463 阅读 · 0 评论 -
2017秋招总结
9.30终于签到了心仪的offer,接到电话那一刻觉得整个月的奔波都是值得的!秋招从7月下旬开始,陆续投了一些内推,奈何遥无音讯;8月秋招的号角已经吹响,身边的各位大佬也已陆续收到各种大offer;羡慕自是不必说,8月中下旬开始到9月中旬,每天都会投简历,修改简历,偶尔抽空看看书,不是不想看,实在是静不下心来。从9月初至月末,这一个月干的最多的事情就是笔试,面试,宣讲会也没去几个,大多有想去的原创 2017-10-01 20:44:08 · 694 阅读 · 1 评论