
数据结构
好好学习312
这个作者很懒,什么都没留下…
展开
-
数据结构-堆的java实现
最大堆:所有根节点元素大于子节点元素最小堆:所有根节点元素小于子节点元素已知一节点位置为i,其左孩子2i+1,右孩子2i+2,父节点(i-1)/2package moshi;import java.util.Arrays;/* * 数据结构->堆 */public class Heap { //最大堆-> 所有子树的根节点大于子节点的完全二叉树 //最小堆->原创 2017-05-10 20:03:10 · 825 阅读 · 0 评论 -
二叉树的前、中、后序遍历详解
前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: [cpp] view plain copy //Binary Tree Node转载 2017-05-08 21:07:43 · 786 阅读 · 0 评论 -
二分查找O(logn)
//二分查找O(logn),要求arr为有序数组 public static int 二分查找(int[] arr,int target){ int start = 0; int end = arr.length-1; while(start<=end){ int mid = (start+end)/2; if(arr[mid] > target){ end =原创 2017-05-08 09:35:31 · 1114 阅读 · 0 评论 -
静态查找-哨兵
//下标1-length-1存储的是数据,下标0的位置存储的是哨兵 //哨兵位置赋值为要查找的数,判断查找结果,若为0则没找到,非0则找到了 public static int staticFind(int[] arr,int target){ arr[0] = target; int length = arr.length-1; while(arr[length] != targ原创 2017-05-08 09:25:03 · 736 阅读 · 0 评论 -
拓扑排序-java
拓扑排序介绍拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。这样说,可能理解起来比较抽象。下面通过简单的例子进行说明! 例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利原创 2017-05-07 19:22:33 · 310 阅读 · 0 评论 -
B树和B+树
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文原创 2017-05-16 11:12:51 · 1215 阅读 · 0 评论 -
最短路径-弗洛伊德算法的java实现
弗洛伊德算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点原创 2017-05-07 18:01:46 · 806 阅读 · 1 评论 -
红黑树与AVL树
1,红黑树(RBT)的定义:它或者是一颗空树,或者是具有一下性质的二叉查找树:1.节点非红即黑。2.根节点是黑色。3.所有NULL结点称为叶子节点,且认为颜色为黑。4.所有红节点的子节点都为黑色。5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。2,如何理解和记忆这5个定义?称为“红黑树”,即节点非红即黑,给节点着原创 2017-05-14 16:02:02 · 557 阅读 · 0 评论 -
迪杰斯特拉-java实现
package suanfa;public class Main { public static void main(String[] args) { int max = Integer.MAX_VALUE-10000; int graph[][] = { {max,max,10,max,30,100}, {max,max,5,max,max,max},原创 2017-05-05 18:40:33 · 423 阅读 · 0 评论 -
克鲁斯卡尔算法的java实现
克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。 克鲁斯卡尔算法的执行步骤: 第一步:在带权连通图中,将边的权值排序; 第二步:判断是否需要选择这条边(此时图中的边已按权值从小到大排好序)。判断的依据是边的两个顶点是否已连通,如果连通则继续下一条;原创 2017-05-05 14:25:28 · 2890 阅读 · 1 评论 -
并查集的理解与java实现
这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,杭电1232畅通工程首先在地图上给你若干个城镇,这些城镇都可原创 2017-05-05 12:12:20 · 2194 阅读 · 5 评论 -
prim算法的java实现
MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任原创 2017-05-05 09:51:01 · 2454 阅读 · 0 评论 -
java希尔排序
package graph;import java.util.Arrays;/* * 希尔排序(基于增量的插入排序) */public class Main { private static void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } p原创 2017-05-12 21:29:50 · 289 阅读 · 0 评论 -
java冒泡、简单插入、选择排序
package graph;import java.util.Arrays;/* * 简单排序总结(冒泡、选择、直接插入) */public class Main { private static void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }原创 2017-05-12 20:06:12 · 235 阅读 · 0 评论 -
java快速排序的优化
当枢纽数选择为数组最大数时,一次partion操作只交换数组的一组数,导致没发生什么变化,int temp = arr[start]的取值很关键,故采取三数取中法。package moshi;/* * 快速排序优化一:优化中枢数的选取,三数取中法 */public class Main { public static void main(String[] args) {原创 2017-05-12 14:36:12 · 350 阅读 · 0 评论 -
java快速排序-原始未优化
package moshi;public class Main { public static void main(String[] args) { Main m = new Main(); int[] arr ={3,4,5,1,2}; m.快速排序(arr); System.out.println(); } public void 快速排序(int[] arr){原创 2017-05-12 10:35:52 · 226 阅读 · 0 评论 -
归并排序
package graph;public class Main { public void 非递归归并排序(int[] arr){ int tmpIndex,leftMin,leftMax,rightMin,rightMax; int[] tempArr = new int[arr.length]; //i为步长:1,2,4,8... for(int i=1;i<arr.le原创 2017-05-11 22:13:44 · 230 阅读 · 0 评论 -
二叉排序树详解
一、为什么要使用二叉排序树对于线性存储的数组来说,通过二分查找等算法其查找效率为log2n是不错的。但是其插入删除数据的效率是比较低的,为了维护数组的有序性,插入删除时必须将一些数据"挪"位置。此算法复杂度为O(n)。如果不需要维护数组的有序性的话,添加数据直接在数组尾添加,删除数据时,也只需要用数组尾数据覆盖删除的数据,并使长度-1即可,但是无序的序列对于查找来说,是十分不好的。所以引入了二原创 2017-05-08 20:05:29 · 560 阅读 · 0 评论