
数据结构与算法
玩名堂_
勤于求知,细于做事
展开
-
java实现最小堆(通过构造函数构造最小堆,相当于堆排序)
最小堆最小堆数据结构也是一棵完全二叉树(叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树)。因为完全二叉树的性质,因此我们用数组来存储树的节点,从上到下,从左到右,按序存在数组,而且子节点的值得大于等于父节点的值。因此堆的根节点是数组中的最小值,这即是最小堆。下面最小堆的实现://最小堆public class MinHea原创 2017-07-11 16:29:11 · 2336 阅读 · 0 评论 -
hashmap实现原理
转载地址:http://zha-zi.iteye.com/blog/1124484Hash ,一般翻译做“ 散列” ,也有直接音译为“ 哈希” 的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值转载 2017-07-18 18:30:24 · 340 阅读 · 0 评论 -
ConcurrentHashMap实现原理
ConcurrentHashMap是Java1.5中引用的一个线程安全的支持高并发的HashMap集合类。这篇文章总结了ConcurrentHashMap的内部实现原理,是对于自己理解后的一些整理。1.HashTable与ConcurrentHashMap的对比HashTable本身是线程安全的,写过Java程序的都知道通过加Synchronized关键字实现线程安全,这样对整转载 2017-07-18 20:07:46 · 335 阅读 · 0 评论 -
java实现二分搜索树
二分搜索树的优势查找元素、插入元素、删除元素的时间复杂度都是O(logn)。还可以方便的回答很多数据之间关系的问题:min,max,floor,ceil,rank,select例如rank,求key=45在所有节点中排名第几?答:可以通过给Node增加一个属性,记录以当前节点为根节点的二叉树的所有节点数(包括根节点),通过它可以方便得知排名结构二分搜索树是一棵二叉树,每个...原创 2017-07-17 19:05:31 · 2044 阅读 · 2 评论 -
java实现并查集算法
并查集并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并。主要作用解决连接问题类UnionFindpublic class UnionFind { private int[] parent; private in原创 2017-07-13 21:43:31 · 1922 阅读 · 0 评论 -
java实现最大索引堆(最大堆的优化版)
最大索引堆最大索引堆是为了防止swap()交换大型数据带来的低效率,所以只交换索引。所以成员变量上比最大堆多了一个存储索引的数组indexs,为了更方便快捷找到某个索引在indexs[]中的位置,因此又添加了一个存储索引位置的数组reverse[],reverse[i]的值表示索引i在indexs[j]==i中的位置j;即indexs[reverse[i]]=i。实现类IndexHea原创 2017-07-12 13:28:04 · 781 阅读 · 0 评论 -
Jdk1.8中的HashMap实现原理
转载自:http://blog.youkuaiyun.com/fjse51/article/details/53811465HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的数据结构在Java编程语言中,最基本的结构就是两种,一转载 2017-09-18 18:54:36 · 369 阅读 · 0 评论 -
根据二叉树的前序遍历串和后序遍历串求中序遍历串算法
如果是根据中序结果和前序或后序的话,得出的结果应该是唯一的,而且也比较简单但是根据前序和后序,求中序结果就有多种可能了,难度有点大,之前百度了一下没找到相关博客文章指导,那就自己琢磨写一个把下面是我自己写的求中序的算法:public class Test { public static String inOrder(String preString,String pos...原创 2018-02-26 23:26:27 · 257 阅读 · 1 评论 -
解leetcode题集....持续更新中
1.给定一个数组nums,写一个函数将数组中的所有0挪到数组末尾而且维持其他所有非零元素相对位置不变举例:nums[3,7,0,6,0,3,2] 函数运行后结果为nums=[3,7,6,3,2,0,0]public class Solution { public static void swap(int[] nums,int a,int b){ int t...原创 2018-03-10 17:16:22 · 466 阅读 · 0 评论 -
java实现通过快速排序来查找数组中第n大的元素
之前写的博客里已经实现过了快速排序,这里就不在介绍//通过快速排序的partition操作找到第N大元素public class Quick_find { private int N; private int arr[]; public Quick_find(int n,int[] arr) { assert(n<=arr.length); N = n; this.原创 2017-07-17 16:09:35 · 1173 阅读 · 0 评论 -
java实现选择、插入、归并、快速排序以及优化
选择排序一共n-1轮循环,第一轮将第一个数与它后面所有数比较,若它大于后面某个数则交换,然后继续拿这个新的索引为0的数与后面的数继续比较,直到这一轮循环结束。第二轮循环则拿索引为1的数与它后面的数继续比较(重复上一轮的操作)。public static void selectsort(int[] arr){ for(int i=0;i<arr.length-1;i++){原创 2017-07-15 20:21:33 · 616 阅读 · 1 评论 -
java实现最大堆及堆排序
最大堆最大堆数据结构是一棵完全二叉树(叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树)。因为完全二叉树的性质,因此我们用数组来存储树的节点,从上到下,从左到右,按序存在数组,而且子节点的值得小于等于父节点的值。因此堆的根节点是数组中的最大值,这即是最大堆。最大堆经常用于实现优先队列。举个栗子:比如英雄联盟或王者荣耀中的英雄在他的攻击范围内,原创 2017-07-11 14:35:38 · 4784 阅读 · 0 评论 -
java实现带权稠密图
数据结构数据结构中对于稀疏图的定义为:有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph),反之边的条数|E|接近|V|²,称为稠密图(dense graph)我写的带权的稠密图所以另外定义一个类Edge:类Edgepublic class Edge { private int a,b; private int weight; privat原创 2017-07-10 21:14:10 · 583 阅读 · 0 评论 -
java计算稀疏图连通分量及两点路径、最短路径
博客初感言:我的第一篇博客,好激动啊,以前只是经常看别的大侠的博客,还从来没想过自己写,以前我记知识点或学习笔记都是直接写在本子上的,感觉这样看起来更方便,不过还是想尝试一下,分享自己的学习经验。希望自己能坚持下去!计算稀疏图连通分量 我写了实现稠密图和稀疏图的两个类,目前只写了计算稀疏图连通分量的算法,代码如下://稠密图--邻接矩阵public class Dense原创 2017-07-08 17:30:41 · 968 阅读 · 0 评论 -
java实现图的最小生成树问题
最小生成树问题1、针对带权无向图2、针对连通图最小生成树问题就是找到V-1条边连接V个顶点且总权值最小切分定理算法需要用到切分定理,切分即把图中的顶点分成两部分。若一条边的两个端点分别属于切分后的不同的两部分,则称这条边为横切边。切分定理:给定任意切分,横切边中权值最小的边必定属于这个最小生成树。所以我们可以从一个点开始扩散慢慢求出最小生成树。原创 2017-07-10 21:46:32 · 2273 阅读 · 0 评论 -
java编写Kruskal算法实现最小生成树
Kruskal算法算法思想很简单就是一个图中最短(权值最小)的那条边就是最小生成树中的边,但是若加上这条边后最小生成树中形成了“环”,则排除这条边继续找出剩下边中的最短边加入最小生成树。而判断是否形成了“环”则是通过并查集的isConnected方法来判断两点(这俩点已在最小生成树中)是否已相连,若已相连我再把这条边加入最小生成树中不就出现“环”了么!(关于并查集的isConnecte方法介绍原创 2017-07-13 21:21:15 · 1502 阅读 · 0 评论 -
java编写Dijkstra单源最短路径算法
Dijkstra单源最短路径算法此算法用于求出图中的一个源点到其余各点的最短路径,此图必须为带权图且不能有负权值,是否为有向图则没关系算法思想关键:设定一个源点s,遍历它的邻边,求出邻边中权值最小的那条边e,获得e另一端点v,则s到v的最短路径必定就是e,因为s到其他点的长度本来就长于e,若还从其他点折回v的话,那长度一定长于e(因此不能有负权边)。然后继续遍历v的邻边,若邻边中最短的原创 2017-07-15 15:00:47 · 659 阅读 · 1 评论 -
java编写Prim算法实现最小生成树(LazyPrim算法的优化版)
之前写的"java实现最小生成树问题"是用LazyPrim算法解决的,时间复杂度为O(ElogE),现在用的Prim算法的时间复杂度为O(ElogV)级别。 PrimMST类中我将之前存储Edge的最小堆换成了存储权值的最小索引堆类PrimMSTpublic class PrimMST { private SparseGraph sg; //稀疏图 private Inde原创 2017-07-13 13:50:33 · 1123 阅读 · 0 评论 -
java实现通过归并排序计算数组逆数对个数
计算逆数对个数public class Inv_numpair { private int count=0; //逆数对的数量 public static int[] geneateArrays(int n){ int arr[]=new int[n]; for(int i=0;i<n;i++){ arr[i]=new Random().nextInt(n)+原创 2017-07-16 21:05:15 · 403 阅读 · 0 评论 -
理解两个大数相乘过程
1,明确程序是一个通用法则。这个实现过程既可以满足一位数字相乘,也可以满足两位数字相乘。既然能够满足一位数字,两位数字,那么自然也能够满足多位数字相乘。2,最开始自己面对这一道面试题,第一反应就是,我无法使用任何编程语言的基本数据类型去表示这样一个大数,自然也不能够满足这个数的乘积了。这也是这个面试题的难点。3,我的想法就是抛开一切数学中的理论概念。用编程语言的字符组成字符串的方式进行思考。...转载 2019-04-02 17:43:16 · 753 阅读 · 0 评论