随笔分类 - Algorithm
摘要:为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树。 "1. 二叉查找树" "2. AVL树" "2.1. 树旋转" "2.1.1. 左旋和右旋" "2.1.2. 左左,右右,左右,右左" "2.2. 删除" "3. 红黑树" "3.1. 插入" "3.2. 删除
阅读全文
摘要:原本没觉得这个简单的数据结构问题我会出问题,今天笔试的时候还懵了一下,所以在这里写一笔强化一下记忆。 前序:根节点-左节点-右节点 中序:左节点-根节点-右节点 后序:左节点-右节点-中节点 X序的意思是先/中/后浏览根节点,对于子节点,永远是先左节点再右节点。
阅读全文
摘要:当多个连续可乘矩阵做乘法时,选择正确的做乘顺序可以有效减少做乘法的次数,而选择的方法可以很容易的通过DP实现。 原理就是对于每一个所求矩阵,搜索所有可以相乘得到它的方法,比较它们的消耗,选取最小值作为采用的方法。 例如,给出矩阵A1(30*35) A2(35*15) A3(15*5) A4(5*10
阅读全文
摘要:最长公共子序列,即给出两个序列,给出最长的公共序列,例如: 序列1 understand 序列2 underground 最长公共序列undernd,长度为7 一般这类问题很适合使用动态规划,其动态规划描述如下: 设序列1为s,序列2为t,则 if s[i+1]==t[j+1] dp[i+1][j+
阅读全文
摘要:剪枝搜索是搜索中常用的一个方法,Binary Search就是一个经典的剪枝搜索例子,在Biniary Search中 我们可以明显看到,当目标被锁定在一半区域内时,就剪掉另一半,并对所在的一半进行搜索。而此时问题化简成为一个只有一半数据规模的子问题,递归这一过程,最终就可以在常数时间解决搜索问题。
阅读全文
摘要:和上篇一样,考前写写伪代码,考完了补上具体的解释和代码。 状态{矩阵,结果集,下界} 全局结果集列表,全局上界初始为Infinite 建立一个heap,存储状态,出堆规则为拥有最小的下界。 利用reduced cost matrix 来把矩阵进行化简,把化简消耗作为下界,将初始状态加入heap 当h
阅读全文
摘要:最近考期博主比较忙,先把思路简单说说,图和代码考完试补。 人员安排问题,即给出员工集合和工作集合,寻找最合理的安排。 对于员工集合P,员工集合会依据某个f来给出某种顺序,需要按该顺序P(i)进行工作安排。 对于工作集合J,可以进行偏序排序,有一个偏序来排列工作。 对于每个员工对应每个工作C(i,j)
阅读全文
摘要:哈夫曼树是一种简单的树结构,建树过程如下: 给出一组数据,不断选择最小的两个数,并用两个数的和作为它们的parent节点,再从数据中删除这两个数,将两个数的和加入数据中,直到所有的数据都被加入树结构,形成一颗树。 这颗树的所有非叶子节点都有两个child,两个child的值的和则是这个节点的值,根节
阅读全文
摘要:与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search。 首先介绍一下binary search,其原理很直接,不断地选取有序数组的组中值,比较组中值与目标的大小,继续搜索目标所在的一半,直到找到目标,递归算法可以很直观的
阅读全文
摘要:前面在介绍并查集时顺便提了Kruskal算法,既然已经说到了最小生成树问题,就没有道理不把Prime算法说了。 这里面先补充下Kruskal算法的大概意思,Kruskal算法通过把所有的边从小到大排列后,不断取权值最小的边加入最小生成树(起初可能是离散的多个树,最终连成一个整体),并通过并查集来舍弃
阅读全文
摘要:旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中非常重要。 分支限界法在上一篇Blog中我有简单说明
阅读全文
摘要:分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法。 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解。 分支界限法常常用到优先队列来选择最佳扩展节点,有时
阅读全文
摘要:回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索
阅读全文
摘要:Graham Scan 概述: 对于凸多边形的定义不在这里做详细叙述,这里给出算法的实现原理。 Step 1: 找出x值最小的点的集合,从其中找出y值最小的点作为初始点 Step 2: 获得新序列后,p[n]=p[1] Step 3: 把p[0],p[1],p[2]放入一个栈,从i=3循环到i=n-
阅读全文
摘要:并查集 并查集处理的是集合之间的关系,即‘union' , 'find' 。在这种数据类型中,N个不同元素被分成若干个组,每组是一个集合,这种集合叫做分离集合。并查集支持查找一个元素所属的集合和两个元素分别所属的集合的合并。 并查集支持以下操作: MAKE(X):建立一个仅有成员X的新集合。 UNI
阅读全文
摘要:标题长坑,就拿最近有在用的来弄吧,先写个大概,以后逐渐完善。 对于以下代码,默认包含头文件: 1.冒泡排序(Bubble Sort) 先从课本上最常见的冒泡排序说起吧,C++代码如下(个人习惯介绍算法使用C++,比伪代码还通俗易懂.......) 在下文中,我会给出实验测试算法复杂度的方法,我们不急
阅读全文