数据结构与算法学习总结(java)
总结学习数据结构与算法的知识点,便于理解与复习
陈大大哈喔
东南大学在读研究生,目标是Java软件开发,希望通过做笔记分享的同时提高自身的编程水平。
展开
-
二十五、程序员10大算法之马踏棋盘算法
一、马踏棋盘算法介绍二、代码实现import java.awt.Point;import java.util.ArrayList;import java.util.Comparator;public class HorseChessboard { private static int X; // 棋盘的列数 private static int Y; // 棋盘的行数 //创建一个数组,标记棋盘的各个位置是否被访问过 private static boolean visited[原创 2020-10-26 10:44:49 · 379 阅读 · 0 评论 -
二十四、程序员10大算法之弗洛伊德(Floyd)算法
一、弗洛伊德(Floyd)算法介绍二、代码实现import java.util.Arrays;public class FloydAlgorithm { public static void main(String[] args) { // 测试看看图是否创建成功 char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; //创建邻接矩阵 int[][] matrix = new int[vertex.length][ve原创 2020-10-26 10:03:04 · 246 阅读 · 1 评论 -
二十三、程序员10大算法之迪杰斯特拉(Dijkstra)算法
一、迪杰斯特拉(Dijkstra)算法介绍二、代码实现import java.util.Arrays;public class DijkstraAlgorithm { public static void main(String[] args) { char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; //邻接矩阵 int[][] matrix = new int[vertex.length][vertex.length]原创 2020-10-23 16:35:30 · 287 阅读 · 1 评论 -
二十二、程序员10大算法之克鲁斯卡尔算法
一、克鲁斯卡尔算法介绍原创 2020-10-23 11:59:33 · 512 阅读 · 0 评论 -
二十一、程序员10大算法之普里姆算法
一、普里姆算法介绍二、代码实现import java.util.Arrays;public class PrimAlgorithm { public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E','F','G'}; int verxs = data.length; //邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联原创 2020-10-22 20:52:35 · 243 阅读 · 0 评论 -
二十、程序员10大算法之贪心算法
一、贪心算法介绍二、代码实现import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;public class GreedyAlgorithm { public static void main(String[] args) { HashMap<String, HashSet<String>> broadcasts = new HashMap原创 2020-10-22 16:47:10 · 140 阅读 · 0 评论 -
十九、程序员10大算法之KMP算法
一、KMP算法介绍参考:详尽的KMP算法介绍二、代码实现2.1 暴力匹配算法解决字符串包含问题import java.util.jar.JarEntry;public class ViolenceMatch { public static void main(String[] args) { String str1 = "abcdefabcghijklmn"; String str2 = "abcg"; int index = vi原创 2020-10-22 15:45:27 · 136 阅读 · 0 评论 -
十八、程序员10大算法之动态规划
一、动态规划算法介绍二、代码实现import javax.swing.plaf.metal.MetalIconFactory;public class KnapsackProblem { public static void main(String[] args) { int[] w = {1,4,3}; //物品的重量 int[] val = {1500,3000,2000}; //物品的价值原创 2020-10-22 11:05:17 · 152 阅读 · 0 评论 -
十七、程序员10大算法之分治算法
一、分治算法介绍二、分治算法应用三、代码实现public class Hanoitower { public static void main(String[] args) { hanoiTower(3,'A','B','C'); } //分治算法解决汉诺塔问题 public static void hanoiTower(int num,char a,char b,char c){ if(num == 1){原创 2020-10-22 09:57:08 · 162 阅读 · 0 评论 -
十六、程序员10大算法之二分查找算法(非递归)
一、二分查找算法介绍二、代码实现package binarysearchnorecursion;public class BinarySearchNoRecur { public static void main(String[] args) { int[] arr = {1,3,8,10,11,67,100}; int index1 = binarySearch(arr,100); System.out.println("index1=原创 2020-10-22 09:37:41 · 75 阅读 · 0 评论 -
十五、图(深度优先遍历和广度优先遍历)
一、图基本介绍二、图的表示方式package graph;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;public class Graph { private ArrayList<String> vertexList; //存储顶点集合 private int[][] edges; //存储图对应的邻结矩阵 private int numOfEd原创 2020-10-16 10:47:39 · 469 阅读 · 0 评论 -
十四、多叉树、2-3树、B树
一、多叉树二、B树介绍原创 2020-10-14 20:28:48 · 89 阅读 · 0 评论 -
十三、平衡二叉树(AVL树)
一、平衡二叉树介绍二、AVL树左旋转 //左旋转方法 private void leftRotate() { //创建新的结点,以当前根结点的值 Node newNode = new Node(value); //把新的结点的左子树设置成当前结点的左子树 newNode.left = left; //把新的结点的右子树设置成带你过去结点的右子树的左子树 newNode.right = right.left; //把当前结点的值替换成右子结点的值 value =原创 2020-10-14 19:58:40 · 79 阅读 · 0 评论 -
十二、二叉排序树(创建、遍历和删除(三种情况)))
一、二叉排序树二、二叉排序树的创建和遍历package binarysorttree.binarysorttree;public class BinarySortTreeDemo { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9}; BinarySortTree binarySortTree = new BinarySortTree(); //循环的添加结点到二叉排序树原创 2020-10-13 17:46:19 · 850 阅读 · 0 评论 -
十一、树(二叉树,顺序存储二叉树,线索化二叉树,赫夫曼树,赫夫曼编码,赫夫曼数据压缩与解压)
一、数组、链表、树存储方式二、二叉树 1.树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。 2.二叉树的子节点分为左节点和右节点。 3.如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。 &nbs原创 2020-10-13 10:18:48 · 188 阅读 · 0 评论 -
十、查找算法(二分查找、插值查找、斐波那契、哈希表)
一、二分查找算法(有序序列)1.查找原理2.代码实现package search;import java.util.ArrayList;import java.util.List;//注意:使用二分查找的前提是 该数组是有序的.public class BinarySearch { public static void main(String[] args) { int arr[] = { 1, 8, 10, 89,1000,1000, 1234 }; //int arr[]原创 2020-09-30 18:02:55 · 138 阅读 · 0 评论 -
九、排序算法大总结(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
一、排序算法介绍以及时间复杂度计算1.排序的分类 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序(考察的比较多):指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。2.算法的时间复杂度计算2.1 时间频度  原创 2020-09-27 20:52:54 · 692 阅读 · 0 评论 -
八、递归(迷宫回溯问题、八皇后问题)
一、了解递归二、迷宫回溯问题1.代码实现:package recursion;public class MiGong { public static void main(String[] args) { // 先创建一个二维数组,模拟迷宫 // 地图 int[][] map = new int[8][7]; // 使用1 表示墙 // 上下全部置为1 for (int i = 0; i &原创 2020-09-25 17:27:12 · 95 阅读 · 0 评论 -
七、前缀、中缀、后缀表达式规则——逆波兰计算器分析与实现
一、前缀、中缀、后缀表达式规则 1.前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 **前缀表达式的计算机求原创 2020-09-24 19:13:01 · 268 阅读 · 0 评论 -
六、栈(stack)——实现综合计算器功能
一、栈的应用场景和介绍 栈是一个先入后出的有序列表,允许插入和删除的一端称为栈顶,另一端为栈底。 应用场景:子程序的调用、处理递归调用、表达式的转换、二叉树的遍历、图形的深度优先(depth-first)搜索法二、栈的思路分析和代码实现(用数组实现栈)//定义一个ArrayStack表示栈class ArrayStack{ private int ma原创 2020-09-24 15:26:22 · 151 阅读 · 0 评论 -
五、环形链表和约瑟夫问题
一、引出问题 约瑟夫问题:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 例如编号为12345的环形链表,从1开始原创 2020-09-22 17:32:25 · 104 阅读 · 0 评论 -
四、双链表
单向链表缺点: 1.查找的方向只能是一个方向,而双向链表可以向前或者向后查找。 2.单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除...原创 2020-09-22 16:32:17 · 68 阅读 · 0 评论 -
三、单链表
一、单链表介绍和内存布局 链表是有序的列表,但是它在内存中的存储不是有序的,单链表中每个节点包含data域和next域,next指向下一个节点。链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。二、单链表创建和遍历的分析实现 ...原创 2020-09-12 15:42:07 · 126 阅读 · 0 评论 -
二、队列(直线队列和环形队列)
队列是一个有序列表,可以用数组或者链表来实现,遵循先入先出的原则。 A.数组模拟队列 利用两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变。...原创 2020-09-09 20:50:39 · 248 阅读 · 0 评论 -
一、稀疏数组
当一个较大数组中的大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 A.二维数组转稀疏数组的处理方法 1.遍历原始的二维数组,得到有效数据的个数sum和行列数 2.根据sum就可以创建稀疏数组spars原创 2020-09-09 16:19:56 · 226 阅读 · 0 评论