算法
Java与大数据进阶
这个作者很懒,什么都没留下…
展开
-
JAVA从一个数组中随机取几个不相同的元素
见java核心卷I,程序3.7我们假设从包含n个不相同的元素的数组all中,取k个不同元素放入result。则int result[] = new int[k]; for(int i=0; i<k; i++) { int temp = (int)(Math.random()*n); result[i] = all[temp]; all[temp] = all[...原创 2019-10-12 08:45:16 · 2697 阅读 · 0 评论 -
旅行商问题的本地查找启发法——2选
从某个初始旅途开始,初始旅途可以随机生成或用一些近似算法生成。每次迭代时,删除一对非邻接边,然后把着两条边的端点用另一对边重新连起来。见https://en.wikipedia.org/wiki/2-opt下面的伪代码是拆开了i-1和i的边以及k和k+1的边,添加i-1到k的边以及i到k+1的边。 2optSwap(route, i, k) { 1. take route[...翻译 2019-01-29 17:58:54 · 217 阅读 · 0 评论 -
分支定界解决旅行商问题
由于旅行商问题是最小化问题,所以我们需要找下界。这里我们每次选择最佳下界的节点进行扩展,用到最小堆。开始的时候,我们这样计算下界lb:对于每一个城市i,求出从城市i到最近的两个城市的距离之和si,求出总和s每次加入一条新的边,我们需要考虑把这条边放进去。对于这条边涉及到的顶点,我们要把这条边算入这两个顶点最近的两个城市间的距离。比如我们加入边a-d,那么a的两个城市有一个必须是d,d的两个城...原创 2018-12-25 19:36:33 · 1520 阅读 · 3 评论 -
红黑树的创建和插入
代码来自https://book.douban.com/subject/10530466/<<data structure and algorithm analysis in java>> /*红黑树是具有下列性质的二叉查找树,是avl树的变种: * 1.每一个节点或者着成红色(两个圈),或者黑色 * 2.根是黑色的 *...转载 2018-12-09 11:07:11 · 192 阅读 · 0 评论 -
prim算法用邻接链表和堆实现
将V分为两个顶点集,一个Vt包含进入生成树的节点,一个V-Vt为剩下的节点。每次选的边的两个顶点要分别落在Vt和V-Vt里面,选满足要求最小的边。这个做法是用最小堆来选择,最小堆里存的是顶点,排序依据是当前生成树到各顶点最短边的权值(可以存下来)。由于堆中元素是|V|-1个,取出一个是log |V|,另外每次取出一个顶点加入生成树,都要比较一下与该顶点相连的那些顶点,如果存的顶点权值发生改...原创 2018-12-12 14:47:45 · 770 阅读 · 0 评论 -
计算a^n的三种对数复杂度算法
1.递归解决a^n= (a ^(n/2)) ^2 ,n为偶数a^n= (a ^((n-1)/2)) ^2*a,n为奇数n==0时返回2和3用n的二进制表示来说明2.从左向右假设n=13,即1101下面是求a的幂的步骤:0-&gt;1-&gt;10-&gt;11-&gt;110-&gt;1100-&gt;1101每次个位+1是*a,后面添0是平方。3.从右向左原创 2018-11-27 15:28:39 · 1776 阅读 · 0 评论 -
分治法求二维凸包问题java
https://blog.csdn.net/bone_ace/article/details/46239187见解法2。有一点需要说明的是,如果有多个到直线p1 pn的距离都最大的点,找pmax使的∠pmax p1 pn最大下面为java代码package fd;import java.util.ArrayList;import java.util.Arrays;import j...原创 2018-11-27 15:12:55 · 667 阅读 · 0 评论 -
B树的查找和插入
找了一本书《数据结构教程(Java语言描述),徐孝凯 主编》,写的挺好的,我发上来大家一起学习。package p215;public class BayerTreeNode { /*根节点非叶节点至少两个分支,非根非叶至少m/2上整个分支 最多m个分支 每个节点关键字的个数是比分支数少一 如非根非叶关键字个数(m/2取上整-1)——(m-1) */ int m;//B-tr...转载 2018-12-04 16:37:03 · 245 阅读 · 0 评论 -
二叉查找树及Avl树
定义不再叙述,看程序应该是这本书,我看的第二版https://book.douban.com/subject/10530466/下面是二叉查找树,我认为比较好的一点是在插入的时候返回修改的子树,代替了c里面的指针,这是我看c数据结构想改写为java时所没有想到的。还有一点,用户在插入时是不知道root的,而插入函数需要root,所以要有两个插入函数,一个是外部的,只传入值;一个是内部的,传...翻译 2018-11-26 15:42:12 · 184 阅读 · 0 评论 -
折半查找和差值查找
都用于有序数组,下面假设单增折半查找思想简单,直接写了public static int BinarySearch(int a[],int k) { int l=0; int r=a.length-1; while(l<=r) { int m=(l+r)/2; if(a[m]==k) return m; else if(k<a[m]) r...原创 2018-11-26 15:13:45 · 128 阅读 · 0 评论 -
俄氏乘法
又称俄国农夫法(Russian peasant method),nm=(n/2)(2m)或nm=((n-1)/2)(2m)+m。n为偶用前一个,奇用后一个。到1*m=m时返回。为什么要提这个算法呢,因为乘除2对计算机来说只是移位,这样速度就比较快了。我从来没有想过类似的方法,比较惊奇,所以记下来学习下。时间效率O(log(n))。下面是非递归的代码。package fds;pub...原创 2018-11-26 14:53:19 · 512 阅读 · 0 评论 -
求解强连通分量的一种方法
如果对于任意两个不同的顶点u和v,存在一个从u到v的有向路径以及从v到u的有向路径,这样的有向图被称为是强连通的。一般来说,一个有向图的顶点可以分割成一些互不相交的最大子集,每个子集的顶点之间可以通过有向图中的有向路径相互访问,这些子集被称为强连通分量。下面的方法来自《算法设计与分析基础》作者: Anany Levitin 译者: 潘彦下面三步说的顶点变成死端是递归的dfs出栈的顺序。...原创 2018-11-24 19:27:53 · 305 阅读 · 0 评论 -
Fibonacci的几种方法讨论
fd原创 2018-11-20 06:40:10 · 104 阅读 · 0 评论 -
汉诺塔
浮点数原创 2018-11-20 05:56:41 · 166 阅读 · 0 评论 -
深度优先dfs求解两点间所有路径
public static void dfs4(AGraph a,int start,int end, int visited[],int stack[],int top) { visited[start]=1; stack[++top]=start; if(start==end) { System.out.println(&quot;成功&quot;); for(int i=0;i...原创 2018-11-23 19:17:04 · 3506 阅读 · 0 评论 -
关于深度优先顶点顺序的感想
众所周知,DFS可以用递归实现,也可以用栈来实现。某算法书上用递归实现,说顶点顺序的种类有两种,我又用栈实现,顶点的顺序又多了两种。不同的顶点顺序可以适应不同场合。BFS只有一种顺序。要注意的是,如果要记录双亲结点,visited[]i可以存储i双亲结点,未被访问的设为-1,被访问的根节点设为-2。这样可以保证存储的元素是0时一定是指的双亲结点是0,没有歧义。如果不记录双亲结点,visited...原创 2018-11-23 18:42:11 · 266 阅读 · 0 评论 -
扩展欧几里得算法
https://www.cnblogs.com/hadilo/p/5914302.html引理:存在 x , y 使得 gcd(a,b)=ax+by目的是求最终的x,y。不停的向前迭代即可。由于java不能取地址,一次返回两个值可以用List,当然也可以写成全局变量。可以见https://www.cnblogs.com/zj0208/p/6207077.htmlpublic static...原创 2018-11-15 06:41:39 · 125 阅读 · 0 评论 -
匈牙利算法解决指派问题(java版)
最初想自己写,没成功参考了一下这个http://www.cnblogs.com/chenyg32/p/3293247.html用的方法是《运筹学(第4版)》,《运筹学》教材编写组编,清华大学出版社6.5指派问题的匈牙利算法上面是用c++写的,我改成了java,但不是完全一样,应该是比原作者时间复杂度低。原来的第三步失败都要全部从头来,我的不用全部重来。...原创 2018-11-07 20:10:32 · 1898 阅读 · 0 评论