随笔分类 -  AlgorithmAndDS

摘要:本章是欧拉图和汉密尔顿图。中国邮递员问题同哥尼斯堡七桥问题,要求不走重复街道。欧拉问题就是一笔画问题。引理:连通图且都是偶点,则任何一条边都在闭迹。哈密尔顿问题又叫环游世界问题。一个连通图或者连通分支去掉某条边就不连通,则该边是桥。存在桥的图没有哈密尔顿圈(过去就回不来)。没有桥不一定有哈密尔顿圈。... 阅读全文
posted @ 2013-08-09 21:23 加拿大小哥哥 编辑
摘要:学妹问了就随手写一下…… 1: /* 2: * 自己写的,以前C++写过,找不到了,学妹问我,就再写了一次 3: * 二叉树前中序得后序 4: */ 5: public class PostOrder { 6: 7: public static void main(String[] args) { 8: String s1 = "abdec"; ... 阅读全文
posted @ 2013-08-09 20:44 加拿大小哥哥 编辑
摘要:一.理论准备 为了学习网络流,先水一道spfa。 SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。为什... 阅读全文
posted @ 2013-08-09 15:38 加拿大小哥哥 编辑
摘要:小鬼图是连通图。连通:两点之间有途径,一定有链(那么有迹);若是途径中有相同的点,那么可以把它们合并成一个圈直接去掉,留下点(我想起了上节课上说的途径可分为若干圈和一个链)。点x与y之间存在链那么就称连通;最短的链称为x和y的距离d(x,y)。若是图中任意两点间均连通,则称为连通图。--------... 阅读全文
posted @ 2013-08-08 23:01 加拿大小哥哥 编辑
摘要:一.基础准备 这个算法研究了两天,整整两天啊,中间水了一道线段树,好在皇天不负有心人,嘿嘿。 1991年计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法(Heap Sort )。堆排序是高效的排序方法。没有最坏情况(即与平均情况一样... 阅读全文
posted @ 2013-08-07 22:40 加拿大小哥哥 编辑
摘要:一.基础准备 自己发现:n个点的话,共n-1个非叶子节点,不过没证明过,直接看图。 线段树,也叫区间树(有人说实际不一样),是一个完全二叉树,它在各个节点保存一条线段,因而常用于解决数列维护问题,树的根节点表示是“整体”的区间,左右子树分别表示这个区间的左半边和右半边。 线段树是一个满二叉树,假设共n个节点,区间为... 阅读全文
posted @ 2013-08-07 09:56 加拿大小哥哥 编辑
摘要:起源于哥尼斯堡七桥问题……没有重边的就是简单图;两点间是邻接的,点和边是关联的。完全图(Kn),n是图阶数(就是点数),任何两点间均有边(直达路径)。图G = {v,e},顶点集和边集。图的度序列(d1,d2……dn),度数从大到小排列,完全图的度全是n-1。环的度是2。一般图:允许有重边和环,所有... 阅读全文
posted @ 2013-08-06 16:56 加拿大小哥哥 编辑
摘要:一.概念引入 银行家算法( banker's algorithm )由 Dijkstra于1965提出,关键是将死锁的问题演示为一个银行家贷款的模型,由于能用于银行系统的现金贷款而出名。一个银行家向一群客户发放信用卡,每个客户有不同的信用额度。每个客户可以提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。银行家承诺每个客户最终都能获得自己需要的额度。所谓“最终... 阅读全文
posted @ 2013-08-04 14:21 加拿大小哥哥 编辑
摘要:一.概念引入 最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。严格地说,最接近点对可能多于1对。为了简单起见,这里只限于找其中的一对。 最简单的就是直接暴力,也可以分治,使用分治的话关键是如何合并,如果两边都是n/2个点比较的话,合并的时间是O(n^2),那么T(n)=2T(n/2)+O(n2),它的解为T(n)=O(n2),还是没什么优势,这就引导我们去优化合并算法。 为了找到一个有效的合并算法,可以先考虑一维情形,看下图: 假设左右两边的最小距离是ans={ans1,ans2},很有可能最小距离分别存在于直线两端p3、q3,如果真是这样 阅读全文
posted @ 2013-08-01 15:32 加拿大小哥哥 编辑
摘要:一.概念引入 最小包围圆问题:对于给定的平面上甩个点所组成的一个集合P,求出P的最小包围圆,即包含P中所有点、半径最小的那个圆。也就是求出这个最小 包围圆的圆心位置和半径。 下面是若干性质。 有限点集P的最小包围圆是唯一的。这里约定,若P中只有一个点v,则最小包围圆是退化的,其半径为0,圆心为点v。 非退化... 阅读全文
posted @ 2013-07-30 23:15 加拿大小哥哥 编辑
摘要:一.求两直线交点class Point { double x; double y; public Point() { this.x = 0; this.y = 0; }}class Line { Point a; Point b; public Line() { this.a = new Point(); this.b = new Point(); } //求两直线的交点,斜率相同的话res=u.a Point intersection(Line u,Line v... 阅读全文
posted @ 2013-07-30 17:53 加拿大小哥哥 编辑
摘要:最近为了研究最小覆盖圆,需要求圆心,所以随手download了几份资料。若是平面点得到的是平面圆,若是三维空间点得到的是空间圆(不是球)。一.第一种方法这种方法当k1或者k2为0时需要分别讨论,不便于计算机编程实现。二.第二种方法 这种方法下只要三点不共线就有结果,三点共面的充要条件是混合积(a*(bXc))为0。 阅读全文
posted @ 2013-07-29 15:17 加拿大小哥哥 编辑
摘要:一.问题描述 凸集(Convex Set): 任意两点的连线都在这个集合内的集合就是一个凸集. ⒈对于一个集合D,D中任意有限个点的线性组合的全体称为D的凸包。 ⒉对于一个集合D,所有包含D的凸集之交称为D的凸包(由此定义可以想到分治算法)。 可以证明,上述两种定义是等价的。点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。一组平面上的点,求一个包含所有点的最小的凸多边形,这就是凸包问题了,这可以形象地想象成在地上放置一些不可移动的... 阅读全文
posted @ 2013-07-29 12:32 加拿大小哥哥 编辑
摘要:一.概念引入 在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安全和密码学上一般都是需要很大的素数.而从目前来看,确定性算法判断素数的性能都不好,所以可以用MC(蒙特卡洛)概率算法来解决,其中Miller Rabin算法就是其中的很经典的解决方法.下面首先介绍下相关的数学理论。 理论基础:Fermat小定理:若n是素数,则对所有1≤a≤n-1的整数a,有a^(n-1)mod n=1;该定理的逆否命题也成立,即a^(n-1)mod n!=1,则n为 阅读全文
posted @ 2013-07-28 14:29 加拿大小哥哥 编辑
摘要:一.概念引入 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为。这显然不能排除存在x∈Xn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有。这就是舍伍德算法设计的基本思想。当s(n)与tA(n)相比可忽略时,舍伍德算法可获得很好的平均性能。 概率算法的一个特点是对同一实例多次运用同一概率算法结果可能同。舍伍德算法(O(sqrt(n)),综合了线性表和线性链表的优点)总能求的问题的一个正确解,当一个确定性算法在最坏情况和平均情况下差别较大时可在这个确定 阅读全文
posted @ 2013-07-27 15:48 加拿大小哥哥 编辑
摘要:一.线性同余法 随机数在计算机中扮演重要角色,不过现实中往往难以产生真正的随机数,很多教材上都采用了线性同余法,产生的随机数也只是在一定范围内,该范围的一定要比研究所使用的范围大,不能没有完全验证就又循环。 好事者称上面的性质为随机数要具有周期性,又要不具有周期性(晕),所谓周期性指的是到达一个足够大的数后又要重新开始,非周期性实际就是指范围要足够大,就像C/C++中要求RAND_MAX至少要是32767。 其中b >= 0,c >= 0,d 的范围),则只需要把上面的calCounts里的if改成y<x^3并且输出不乘以4就好了。四. 舍伍德(Sherwood)算法 五.拉 阅读全文
posted @ 2013-07-26 16:04 加拿大小哥哥 编辑
摘要:一.概念引入 有作者把计数排序也称为桶排序(各个桶中元素的排序采用计数排序),得到数组C后直接从前往后遍历,输出数组值次数组下标,为0就不输出(或者存入原数组,不稳定),不过笔者认为这种说法不严谨(一个很明显的问题是输出会是双重for循环,不过也有那个意思,叫鸽巢排序也未尝不可),因为桶排序要求输入数据在[0,1)范围内(计数排序要求整数;实际上要么全是整数,要么小数,便于划分桶),先把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去。因为输入数均匀且独立分布在[0,1)上,所以,一般不会有很多数落在一个桶中的情况。为了得到结果,先对各个桶中的数进行排序,然后 阅读全文
posted @ 2013-07-25 15:00 加拿大小哥哥 编辑
摘要:一.概念 基数排序也不是基于比较和元素移位的,又称桶子法;数据结构课本上首先由扑克牌的排序引入,继而引出多关键字比较。 本文是基于计数排序的基数排序,只介绍最低位优先(Least Significant Digit First),谷歌之发现就几乎没有介绍MSD的,所谓LSD就是从数字的最低位逐个比较,比较的趟数就是最大数字的位数digit,因此需要先用countDigit方法求出位数digit。 局限性:本算法是稳定的,LSD需要使用稳定的算法,由于按位比较,因此需要整数,和计数排序不同的是,整数可以是负数(各种排序都可以正负混合),也可以很大,为什么呢? 数值较大:由于是按比较,统计数字出现 阅读全文
posted @ 2013-07-24 14:45 加拿大小哥哥 编辑
摘要:一.算法简介 通过统计元素出现的次数进而排序,需要一个辅助数组,大小是最大元素值(想想计数的过程),为了更好的理解计数排序,我们先来想象一下如果一个数组里所有元素都是非负整数(数组下标是整数),而且都在0-max(由于内存的原因,这个值要小一些)以内,那对于数组里每个元素来说,如果我能知道数组里有多少项小于或等于该元素,就能准确地给出该元素在排序后的数组的位置。 局限性:通过上面的描述可以看出需要整数(若有负数,则正负数分别排序),而且最大值要在能开数组范围内。 算法是稳定的,算法第五步从后往前保证了稳定性,希望读者细细体会……二.算法描述求得元素最大值max(看算法实现过程,体会这个方法需要 阅读全文
posted @ 2013-07-23 23:49 加拿大小哥哥 编辑
摘要:常可用来判断两个元素是否在同一个集合中,n^2的复杂度太大。 1 #include 2 3 #define MAX 100 4 int parent[MAX]; 5 6 int find(int x) 7 { 8 if(x=MAX) 9 {10 return... 阅读全文
posted @ 2013-06-07 12:59 加拿大小哥哥 编辑