
数据结构
yulio1234
这个作者很懒,什么都没留下…
展开
-
二叉搜索树实现与深度优先遍历和广度优先遍历
public class BinarySearchTree<T> { private TreeNode root; /** * 插入数据 * @param key * @param value */ public void insert(int key,T value){ if(root == null){原创 2017-08-16 21:18:34 · 350 阅读 · 0 评论 -
图的基本概念
图的基本定义图是由一组顶点和一组能够将两个顶点相连的边组成的。 图是一个二元组,即G=(V ,E)。V(vertex)是顶点集,E(edge)是边集。每条边就是一组顶点对(v,w)。v,w∈V。边也叫做弧(arc) 有向图:如果顶点对是有序的,或者弧是有向,则图是有向图。 无向图:如果顶点v,w都属于E,则v,w是邻接的。如果v,w邻接,w,v也邻接。则说明图是无向图。 连通图:如果任意原创 2017-08-31 07:46:29 · 574 阅读 · 0 评论 -
图的广度优先遍历概念和实现
广度优先遍历是按层次遍历,和树的广度优先遍历很像。给定一个顶点,一层一层的往外遍历。可以想象成一组人在向各个方向走迷宫,当遇到路口时等待其他人走到这一层路口,然后分裂成更多的人走这个迷宫。 广度优先遍历是通过队列实现的。/** * 广度优先遍历 * @author yuli * */public class BreadthFirstSearch implements Paths{原创 2017-08-31 08:32:59 · 1090 阅读 · 0 评论 -
最小生成树之kruskal算法概念与实现
概念最小生成树的kruskal算法非常简单了,原理和prim算法差不多,然而kruskal并不是从源点开始层次考察的,而是直接用优先队列存储所有边,通过贪心算法的思想,用权重最小的边组成最小生成树。需要注意的是要通过并查集过滤掉组成环的边。实现/** * 最小生成树,克鲁斯卡尔算法 * @author yuli * */public class KruskalMst ...原创 2017-09-10 09:23:02 · 325 阅读 · 0 评论 -
二叉堆的基本概念与实现
基本概念二叉堆又名堆,或者优先队列。一般实现在堆顶的元素总是最小的。 二叉堆是一颗用数组实现的完全二叉树。 要实现二叉堆必须满足以下条件: 1堆有序,二叉树中每一个子树的父节点不大于(大根堆)两个子节点。 2树的父节点的两个子节点位置为 2k和2k+1(不使用数组的0号索引),如果使用0号索引,两个子节点的位置为2*k+1和2*k=2。 要实现堆有序,主要依靠上浮(swim)和下沉(sni原创 2017-09-18 21:16:43 · 754 阅读 · 0 评论 -
最短路径之Dijkstra算法的概念与实现
基本概念要找出最短路径,其实就是从起点遍历所有能到达的顶点,然后计算他们的权重。Dijkstra算法核心在于边的松弛(relax),可以想象成一根绷紧的橡皮筋,让它放松下来。即是计算源点(s)经过当前点(v)到目标点(w)的权重,如果比目标点(w)之前的权重要小,就替换掉。最终的结果就是生成一颗最小路径树。这个算法和prim算法非常相似,甚至就是prim即时算法的变种。如果加权无向图和加权有向图的边原创 2017-09-11 20:34:54 · 1286 阅读 · 0 评论 -
最短路径的概念与基本数据结构
概念最短路径最直接的例子就是导航软件的,从一个地方到另一个地方的路径。要实现最短路径算法,一般使用一个加权有向图。即找到一个顶点到另一个顶点权重最小的有向路径。基本的数据结构带权有向图的数据结构和带权无向图差不多,只是添加边的时候不添加一条双向的边。/** * 加权有向图 * @author yuli * */public class EdgeWeightedDiGraph { p原创 2017-09-11 20:17:41 · 1446 阅读 · 0 评论 -
选择排序
基本概念选择排序算法是原地排序(in-place)平均复杂度是O(n^2)假定有A,B两个数组,A数组没有元素,B数组充满元素。选择排序就是每次将B数组里最小的元素放入(add)A数组中。到最后A数组充满了有序的元素,B数组元素为空。这和排序扑克牌有点像。选择排序动图代码实现/** * 选择排序 * @author yuli * */public class SelectionSort exten...原创 2018-03-08 21:43:35 · 256 阅读 · 0 评论 -
插入排序
基本概念从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已排序的元素小于或者等于新元素的位置将新元素插入到该位置后重复步骤2~5分类 ————- 内部比较排序(in-place) 数据结构 ———- 数组 最差时间复杂度 —- 最坏情况为输入序列是降序排列的,此时时原创 2018-03-09 07:55:38 · 228 阅读 · 0 评论 -
无向图的实现
/** * 无向图 * @author yuli * */public class UndirectedGraph { private int vertex;//顶点 private int edge;//边 private LinkedList<Integer>[] adj;//邻接表 /** * 内部创建 * @param v 顶点原创 2017-08-31 07:50:01 · 615 阅读 · 0 评论 -
有向图的实现
public class DirectedGraph { private int vertex;//顶点 private int edge;//边 private LinkedList<Integer>[] adj;//邻接表 /** * 内部创建 * @param v 顶点 */ @SuppressWarnings("unch原创 2017-08-31 07:57:59 · 715 阅读 · 0 评论 -
栈结构数组实现
public class MyStack<T> { private T[] element; private int size; private int topOfStack = -1; public MyStack(){ this(10); } public MyStack(int length){ element =原创 2017-08-13 17:55:02 · 245 阅读 · 0 评论 -
线性表链表实现
package cn.yuli.list;public class MyLinkedList<T> { private Node<T> head;//链表头结点 private Node<T> tail;//链表尾节点 private int size = 0; public MyLinkedList(){ clean(); } /**原创 2017-08-13 17:49:08 · 349 阅读 · 0 评论 -
线性表数组实现
/** * 线性表,数组实现 * @author yuli * */public class MyArrayList<T> { private static final int DEFAULT_CAPACITY = 10;//默认容量 private int size; private Object[] items; public MyArrayList()原创 2017-08-13 17:47:23 · 275 阅读 · 0 评论 -
avl树的基本概念与节点旋转
基本概念avl树也是一颗二叉搜索数,所以也遵循二叉搜索树的定义,根节点的左子树永远比节点小,右子树永远比节点大。 - 树深根节点的最大的层次平衡因子某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(BF,Balance Factor)。 平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。否则这棵树就是不平衡的。旋转节点的平衡因子大于1或者小于-1的时候就要对节点进行旋原创 2017-08-21 20:36:46 · 1054 阅读 · 0 评论 -
图的最小生成树概念和数据结构实现
最小生成树(MST)基本概念生成树是一种依托在加权图上的概念,而加权图是一种为每条边关联一个权值或者是成本的图模型。 最小生成树:给定一副加权无向图,找到它的一颗最小生成树。图的生成树是它的一颗含有其所有顶点的无环连通子图。一副加权图的最少小生成树(MST)是树中所有边的权值之和最小的生成树。最小生成树的前提条件是树的两个重要性质: 用一条边连接树的任意两个顶点都会产生一个新的环。 从树中删去原创 2017-09-03 20:14:33 · 944 阅读 · 0 评论 -
avl树的完整实现
public class AVLTree<T> { AvlNode<T> root;//树根 public void insert(int key,T value){ root = insert(root,key,value); } public AvlNode<T> insert(AvlNode<T> node,int key,T value){原创 2017-08-23 07:35:43 · 375 阅读 · 0 评论 -
最小生成树之prim算法概念与实现
基本概念prim算法是以顶点为视角的,每一步都会为生长中的树添加一条边。从初始顶点出发,然后找到顶点周围最小的边,然后移动到最小边的另一个端点,继续找到顶点周围最小的边,直到得到最小生成树。所以prim算法的轨迹是一颗从初始顶点不断蔓延的树。prim算法懒惰实现prim算法的懒惰实现很简单,将需要考察的顶点的边放进一个优先队列中,并考察边的顶点是否存在于最小生成树中或者是否形成一个环。如果都没有,就原创 2017-09-04 22:03:22 · 544 阅读 · 0 评论 -
图的深度优先遍历的概念与实现
图的深度优先遍历是从初始顶点出发,找到是否有邻接点,判断是否访问过,如果没有访问过访问该邻接点,如果邻接点还有邻接点就继续访问,直到到达没有邻接点可以访问的顶点,就回退到上一个顶点。 深度优先遍历可以想象成走迷宫,一直路过各个顶点,直到没有路了,再回退到上个顶点继续走。因此是递归思想。可以用方法(method)递归和栈(stack)递归两种方式实现。接口Paths是抽象出遍历路径的类。public原创 2017-08-31 08:19:35 · 1031 阅读 · 0 评论 -
符号表的概念与实现
基本概念符号表最主要的目的就是将一个键和一个值联系起来。 定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作,即给定建得到相应的值。每个键只对应一个值向符号表中插入键值对,如果已存在就会替换原有的值/** * 有序数组符号表 * @author yuli * */public class SymbolTable<K extends Comparable<原创 2018-03-24 15:56:20 · 6402 阅读 · 0 评论