![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
佳亮
这个作者很懒,什么都没留下…
展开
-
分治思想解决汉诺塔的问题
/** * 1,关于分治算法: * 2,使用分治思想解决汉诺塔的问题 * 3,解决汉诺塔问题的思路:无论有多少个盘,都可以分成两部分,最下面的1个盘和该盘上面的所有盘(假设这些盘都在A上)。 * step1:将1个盘上面的所有盘移动到B上。 * step2:将最下面的1个盘移动到C上。 * step3:将B上面的所有盘移动到C上(如何将B上面的盘移动到C上,) */public class Hanoitower { public static void main(Str.原创 2020-07-22 11:21:49 · 184 阅读 · 0 评论 -
红黑树简介
1,红黑树定义和性质红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。 性质3:每个叶子节点(NIL)是黑色,在Java中,叶子结点是为null的结点。 性质4:每个红色结点的两个子结点一定都是黑色。 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。从性质5又可以推出:性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点2,节点的插入红黑树插入节点,默认是红色。需要变色转载 2020-07-22 11:14:28 · 211 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法之最小生成树
/** * 克鲁斯卡尔(Kruskal)算法实现最小生成树 */public class Kruskal{ //边的个数 private int edgeNum; //顶点数组 private char[] vertexs; //邻接矩阵 private int[][] matrix; //表示两个顶点不能联通 private static final int INF = Integer.MAX_VALUE; public .转载 2020-07-22 10:53:32 · 209 阅读 · 0 评论 -
有序数组查找算法:二分法和插值法
/** * 有序数组的值查找 */public class Search { public static void main(String[] args) { int[] arr={1,2,3,4,5,6,7,8,9,10}; //int i = binarySearch3(arr, 3); int i = binarySearch(arr, 91); System.out.println(i); } /**.原创 2020-07-22 10:39:26 · 317 阅读 · 0 评论 -
使用KMP算法进行字符串查找
/** * KMP算法解决字符匹配问题 */public class KMP { public static void main(String[] args) { String str1="ABABACEF"; String str2="BAC"; //System.out.println(foolWay2(str1,str2)); // System.out.println(kmpSearch(str1,str2,kmpNext.原创 2020-07-22 10:36:01 · 663 阅读 · 0 评论 -
普里姆(Prim)算法之最小生成树
涉及到的图如下:普利姆算法简介:普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图普利姆的算法如下:设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u]=1若集合U中顶点ui与集合V-U中的顶点vj之间存在边,则寻找这些边中权值最小的边,但不能构成回路,将顶点原创 2020-07-18 18:50:32 · 1110 阅读 · 0 评论 -
弗洛伊德(Floyd)算法求最短路径
涉及到的图如下:代码如下:/** * 1,弗洛伊德算法实现 加全权图中的 寻求最短路径可以用来求解任意一点,到其他任意一点之间的最短距离。 * 2,设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为:min((Lik+Lkj),Lij),vk的取值为图中所有顶点,则可获得vi到vj的最短路径 * 至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得 * 3,参考链接:原创 2020-07-18 12:07:49 · 4462 阅读 · 0 评论 -
骑士周游(马踏棋盘)算法java实现
马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格棋盘如下:代码如下:/** * 骑士周游/,马踏棋盘算法 * 参考链接:https://www.jianshu.com/p/62f44b5f2e1b */public class HorseChessBoard{ //棋盘的行 private static int X;转载 2020-07-18 10:08:00 · 505 阅读 · 0 评论 -
无向图的创建和深度优先遍历,广度优先遍历
声明:下面的代码只是一个最基础的实现,没有经过严格的测试图有两种表示方式,一种是邻接矩阵(二维数组),另一种是邻接表(数组+链表)。下面的例子是针对于邻接链表实现的上面的两幅图,第一副是无向图,第二幅是用邻接链表表示的无向图。代码如下:/** * 图用来表示多对多的关系,数组和链表有前驱和后继,可以认为是一对一的关系。树是一对多的关系。 * 图的基本元素:顶点,边,路径,有向图,无向图,带权图(又称之为网),其他概念参考:https://www.cnblogs.com.原创 2020-07-16 09:18:29 · 2699 阅读 · 0 评论 -
平衡二叉树
声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 平衡二叉树(AVL) * 1,可以保证查询效率,它是一棵空树或者它的左右两个子树的高度差不超过1,并且左右两个子树都是一颗平衡二叉树。 * 2,实现方式有:红黑树,AVL算法,替罪羊树,Treap,伸展树等。 * 3,平衡二叉树是一种特殊的二叉排序树。除了满足二叉排序树的特性之外,必须在添加新节点时,通过判断左右子树的高度 * 通过左旋转或者右旋转来满足平衡二叉树的特性,即左右两个子树的高度差不能超过1 */publi原创 2020-07-15 12:00:08 · 122 阅读 · 0 评论 -
二叉排序树
声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 二叉排序树(BST) * 定义:对于任何一个非叶子节点,要求左子节点的值比父节点小,右子节点的值比父节点值大。如果有相同的值,可以在 * 左节点或者右节点 */public class BinarySortTree { public Node root; public static void main(String[] args) { BinarySortTree tree = new B原创 2020-07-15 11:58:41 · 105 阅读 · 0 评论 -
赫夫曼树
赫夫曼树是一种二叉树。在通信领域的编码和文件的压缩中,会用到赫夫曼树的相关概念下面的代码是创建一个赫夫曼树声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 赫夫曼树:给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径最小(WPL), * 这样的二叉树称之为赫夫曼树。 */public class HuffmanTree { public static void main(String[] args) { int[] arr=.原创 2020-07-15 11:57:03 · 110 阅读 · 0 评论 -
二叉树的基本定义
包括二叉树的前序遍历,中序遍历和后序遍历。下面的代码是一个基本的二叉树,非二叉排序树和平衡二叉树声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 二叉树 * 树的遍历参考:https://www.cnblogs.com/zhi-leaf/p/10813048.html */public class BinaryTree { public static void main(String[] args) { BinaryTree tree .原创 2020-07-15 11:53:07 · 364 阅读 · 0 评论 -
有序数组的值查找
下面的代码分三部分:递归的方式实现二分查找,非递归的方式实现二分查找,插值查找/** * 有序数组的值查找 */public class Search { public static void main(String[] args) { int[] arr={1,2,3,4,5,6,7,8,9,10}; int i = insertSearch(arr, 0, arr.length - 1, 7); //int i = binarySear原创 2020-07-15 11:49:26 · 354 阅读 · 0 评论 -
常见的8中排序算法
包含冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,基数排序,堆排序声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 排序 */public class Sort { public static void main(String[] args) { int[] arr=new int[8000000]; for (int i = 0; i < arr.length; i++) { arr[i原创 2020-07-15 11:46:48 · 207 阅读 · 0 评论 -
栈的链表实现(包含单向链表的实现)
栈是一个先入后出的有序数据结构(FILO)栈的操作操作只能是在栈顶(Top)或者栈底(Bottom)进行声明:下面的代码只是一个最基础的实现,没有经过严格的测试。public class MyLinkedStack<E> { public static void main(String[] args) { MyLinkedStack<String> myLinkedStack = new MyLinkedStack(); myL原创 2020-07-15 11:43:15 · 173 阅读 · 0 评论 -
栈的数组实现
栈是一个先入后出的有序数据结构(FILO)栈的操作操作只能是在栈顶(Top)或者栈底(Bottom)进行声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 使用数组模拟栈 */public class MyArrayStack<E> { private int top=-1; private int maxSize; private Object[] arr; public MyArrayStack(int maxSize)原创 2020-07-15 11:41:03 · 143 阅读 · 0 评论 -
java自定义HashMap
HashMap的数据结构是数组+链表,之前的博客中有自定义的数组列表和链表,这里的数组和链表就是使用之前自定义的数组列表和链表。实现的方法有put(K k,V v),get(K k),clear(),containsKey(K k),replace(K k,V v),remove(K k),不支持null值。确定数组下标的方式直接用key的hashcode和数组容量进行取余运算,没有使用k...原创 2019-09-20 19:51:31 · 1128 阅读 · 0 评论 -
java实现自定义ArrayList
通过数组实现了基本的增删改查,通过了基本的测试,但没有进行更严格的测试,没有考虑并发。public class MyArrayList<E> implements Iterable<E> { //ArrayList<String> strings; private static final int DEFAULT_CAPACITY = 10...原创 2019-09-17 13:58:27 · 1043 阅读 · 0 评论 -
java自定义LinkedList:实现单向链表的增删改查和反转
单向链表的节点由两部分组成,一个是值,一个是下一个节点的引用(指针)。其数据在内存中存储是不连续的,它存储的数据分散在内存中。单向链表向外暴露的只有一个头节点(Head),对链表的所有操作,都是直接或者间接地通过其头节点来进行的。添加元素时,在链表头部添加,效率最高。在链表的中间或尾部添加,效率很低。以下是根据链表的原理进行的简单的实现,不一定严谨和健壮java实现的代码如下...原创 2019-09-14 16:55:58 · 467 阅读 · 0 评论