![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
BayMax_39
talk is cheap,show me the code.
展开
-
Java 递归+回溯的应用(八皇后问题+数独问题)
Java 递归+回溯的应用(八皇后问题+数独问题)1.什么是八皇后问题?2.解题思路 首先将问题抽象,八皇后问题是一个二维数组,但是由于每行只摆放一个皇后,可用一维数组保存,即数组的索引为棋盘的行,数组的值为摆放在当前行的位置。如arr【0】=0,即在第1行的第1列放置一个皇后。这样问题就可以简化为求一个一维数组,同时这个一维数组需满足的条件是arr[i]!=arr[n](不能为同一列)...原创 2019-08-14 09:10:24 · 256 阅读 · 0 评论 -
Java 最小生成树算法-普里姆算法和克鲁斯卡尔算法
1.生成树与最小生成树先介绍一下最小生成树(Minimum Cost Spanning Tree),简称MST。给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树N个顶点,一定有N-1条边包含全部顶点N-1条边都在图中求最小生成树的算法主要是:普里姆算法和克鲁斯卡尔算法2.普里姆算法和克鲁斯卡尔算法2.1普里姆算法普利姆(Prim)...原创 2019-09-05 18:26:55 · 796 阅读 · 5 评论 -
Java图的表示与遍历(深度优先算法DFS+广度优先算法BFS)
1.图的表示图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…n个点。邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失.邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成为了表示方便,之后的图用二维...原创 2019-09-05 17:47:16 · 1530 阅读 · 0 评论 -
Java KMP算法
1.字符串匹配问题问题:有一个字符串 str1= “BBC ABCDAB ABCDABDABDE”,和一个子串 str2=“ABCDABD”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1分析:方法一:暴力穷举算法,将str1的第一个位置作为开始位置和str2进行依次匹配,匹配不成功,str1的第二个位置作为开始匹配的位置继续重复之前的操...原创 2019-09-04 19:12:17 · 322 阅读 · 0 评论 -
Java 平衡二叉树之单旋(左旋,右旋)与双旋
1.平衡二叉树平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。首先要明确的是,平衡二叉树是一棵二叉排序树(),它的出现是为了解决普通二叉排序树不平衡的问题。如图,在插入结点之前首先要查找插入位置...原创 2019-09-03 14:45:39 · 2467 阅读 · 3 评论 -
Java 二叉排序树的创建与结点删除
1.二叉排序树二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。所以二叉排序树的中序遍历是升序。eg.数组为 Array(7, 3, 10, 12, 5, 1, 9)2.二叉排序树的创建(结点的添加)思想:比较待插入结点与当前结点的大小关系,若小于当前结点,往左...原创 2019-09-02 22:10:29 · 929 阅读 · 0 评论 -
Java 哈夫曼编码与解码
1.哈夫曼树给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。构成哈夫曼树的步骤:从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树取出根节点权值最小的两棵二叉树组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两棵二叉树根节点权...原创 2019-09-02 14:07:08 · 1523 阅读 · 1 评论 -
Java 线索二叉树和自定义线索二叉树的代码实现
1.线索二叉树n个结点的二叉链表中含有n+1(推导:每个节点有两个指针域,除根节点外每个节点消耗一个指针域:2)个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序...原创 2019-09-01 17:07:14 · 301 阅读 · 1 评论 -
Java 前序中序后序遍历二叉树&查找二叉树的代码实现
1.二叉树的概念树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。二叉树的子节点分为左节点和右节点。如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。树的遍历前序遍历: 先输出父...原创 2019-08-31 13:42:23 · 432 阅读 · 0 评论 -
Java 关于栈的一些常见算法题的记录(代码+详细注释)
1.自定义栈(数组实现)//使用数组模拟栈class MyStack{ private int maxSize; private int top; private int[] arr; //栈构造器 public MyStack(int maxSize) { this.maxSize=maxSize; arr=new int[maxSize]; top=-1; ...原创 2019-08-29 00:35:12 · 406 阅读 · 0 评论 -
Java 约瑟夫环问题的两种解法(循环数组,单向环形链表)
1.问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。2.解决方法一:循环数组提示:每次报数,如果满足出圈的条件就将数组元素设置为-1,当下次报数时跳过-1。直至数组最后一个元素变为-1...原创 2019-08-28 23:53:52 · 1046 阅读 · 0 评论 -
Java实现自定义HashMap
1.HashMap的实现原理HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。哈希表的基本结构是数组加链表。able:核心存储结构,也称之为“位桶数组”transient Node<K,V>[] table;2.代码实现HashMap存储键值对的过程?1.调用Object.hashCode()2.HashMap.hash()3.根据hash,将Node存...原创 2019-08-26 20:32:49 · 828 阅读 · 0 评论 -
Java实现查找算法(线性查找+二分查找+插入查找+斐波拉契查找)
1. 线性查找算法/** * 线性查找算法 * 找到一个满足条件的值就返回,若未查找到,返回-1 * @param arr * @param n * @return */public static int seqSearch(int []arr,int n){//线性查找是逐一对比,发现有相同值,就返回下标for (int i = 0; i < arr.length; i...原创 2019-08-26 12:31:51 · 176 阅读 · 0 评论 -
Java 常用排序算法的实现(动图+代码+带详细备注)
1.常用的排序算法2.原创 2019-08-16 10:50:49 · 161 阅读 · 0 评论 -
Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法
1.迪杰斯特拉算法VS弗洛伊德算法迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。2.迪杰斯特拉算法迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思...原创 2019-09-05 19:32:03 · 746 阅读 · 0 评论