数据结构与算法
文章平均质量分 75
数据结构与算法
奶茶37.2℃
海纳百川有容乃大
展开
-
Floyd(弗洛伊德)算法
一.简介弗洛伊德算法寻找多源点之间最短路径的算法,即所有节点之间最短路径。二.实现package com.vincent;import java.util.*;public class Main { public static void main(String[] args) throws Exception { char[] datas = {'a','b','c','d','e','f'}; int[][] graph = new int[dat原创 2020-06-24 22:51:22 · 400 阅读 · 0 评论 -
Dijkstra(迪杰斯特拉)算法
一.简介迪克斯特拉算法又名Dijkstra算法(属于贪心算法)。Dijkstra算法是从一节点到其余各节点最短路径计算方法。迪杰斯特拉算法以起始点为中心向外层层扩展,直到扩展到终点为止。二.实现package com.vincent;import java.util.*;public class Main { public static void main(String[] args) throws Exception { char[] datas = {'a',原创 2020-06-23 22:30:57 · 2263 阅读 · 0 评论 -
普里姆 & 克鲁斯卡尔算法
一.简介连通图:任意2节点之间都有路径相通最小生成树:一个 n 结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边(n-1)。 最小生成树可以用prim(普里姆)算法或kruskal(克鲁斯卡尔)算法求出。二.实现package com.vincent;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main原创 2020-06-21 22:48:51 · 1104 阅读 · 0 评论 -
贪心算法
一.简介贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法适用前提是局部最优解会导致全局最优解(局部最优解不一定是全局最佳解)二.实现1.期望商品找零纸币数最少:package com.vincent;import java.util.ArrayList;import java.util.List;public class Main { public static voi原创 2020-06-21 18:24:00 · 478 阅读 · 0 评论 -
KMP算法
一.简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败字符前面已匹配字符计算跳转表,子串从跳转表获取下一次比较索引。定义问题:主串:s = S[0,1,2,…,n-1] 字符串长度为n子串:p = P[0,1,…,m-1], 字符串长度为m且m<=n暴力匹配1.从主串的首字符开始,与模式串逐一进行匹配2.匹配失败时主串回溯到开始匹配原创 2020-06-19 19:49:21 · 441 阅读 · 0 评论 -
动态规划 & 枚举算法
一.简介二.实现package com.vincent;import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) throws Exception { int[][] data = {{1,1500},{4,3000},{3,2000}}; List<Integer> rst =原创 2020-06-16 08:27:34 · 1103 阅读 · 0 评论 -
分治算法
一.简介分治算法的思想是将一个规模为n的问题分解为k个规模较小的子问题,解决小规模的方法与解决大规模的方法一样。二.实现三.总结原创 2020-06-15 20:19:22 · 261 阅读 · 0 评论 -
Graph(图)
一.简介图是一种多对多的非线性结构,每个节点有0到多个相邻节点,节点之间的连接成为边。二.实现三.总结原创 2020-06-15 09:29:56 · 384 阅读 · 0 评论 -
B+tree
一.简介二.实现package com.vincent;import java.util.*;public class Main { public static void main(String[] args) throws Exception { BPlusTree<Integer> tree = new BPlusTree<>(5); for(Integer data : Arrays.asList(4,3,6,5,7,8,9原创 2020-06-14 21:17:54 · 351 阅读 · 0 评论 -
B-tree
一.简介B树是平衡的多叉树,B是balance的首字母,表示平衡2-3树是阶为3的B树,相对2叉排序树、AVL树、红黑树,每个节点可以多存储一个数据,对于存储于磁盘的大数据量还是需要非常频繁的IO操作,在2-3树基础上可以扩展出节点度更高的任意平衡树。二.实现package com.vincent;import java.util.*;public class Main { public static void main(String[] args) throws Exceptio原创 2020-06-11 17:37:30 · 448 阅读 · 0 评论 -
2-3树
一.简介大量数据会造成二叉排序树的深度特别大,尤其是数据存储在硬盘上时,大量的数据将导致过多的IO,严重影响程序效率。多路查找树的每个节点处可以存储多个元素,且每一个节点的孩子可以多于两个。二.实现三.总结...原创 2020-06-08 23:06:42 · 354 阅读 · 0 评论 -
红黑树
1.简介红黑树作为一种二叉搜索树的一种实现,红黑树的左右子树高度差可能大于 1。所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。1.节点是红色或黑色。2.根节点是黑色。3.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)4.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。故红黑树是黑色平衡的树如果插入节点是黑色则所在路径原创 2020-06-07 23:08:56 · 2339 阅读 · 0 评论 -
平衡二叉树(AVL)
一.简介AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。1.本身首先是一棵二叉搜索树。2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。二.实现三.总结...原创 2020-06-04 22:55:33 · 721 阅读 · 0 评论 -
排序二叉树(BST)
一.简介二.实现package com.vincent;import java.util.*;public class Main { public static void main(String[] args) throws Exception { BinSortTree<Integer> tree = new BinSortTree<>(); for(int i=0;i<32;i++){ tree.原创 2020-06-04 08:26:00 · 503 阅读 · 0 评论 -
霍夫曼编码/解码
一.简介把信息转换成计算机能够识别的二进制形式,被称为编码。按编码位数长度是否固定分为:定长编码、变长编码。定长编码容易设计,运行效率高。如果要对数据信息压缩就需要采用变长编码,把出现频率高的用位数少的编码,出现频率低的用更多位编码便可以实现数据压缩。霍夫曼树是一种WPL(树的带权路径) 最小的二叉树,二叉树刚好有左/右节点,可以方便映射为2进制(如左节点方向表示0,右节点方向表示1)。霍夫曼编码是一种可变长编码方式,依据字符出现频率作为霍夫曼树节点的权重构建霍夫曼树。二.实现三.总结1.霍夫原创 2020-06-02 23:28:15 · 1430 阅读 · 1 评论 -
霍夫曼树
一.简介二.实现package com.vincent.main;import java.util.*;public class Main { public static void main(String[] args) { int[] arr = new int[]{}; System.out.println(Arrays.toString(arr)); HuffmanTree tree = new HuffmanTree()原创 2020-06-02 17:30:27 · 307 阅读 · 0 评论 -
堆排序
一.简介堆排序(英语:Heapsort)是利用堆这种数据结构所设计的一种排序算法。堆是一个完全二叉树的结构,并满足堆积的性质:子结点的值总是小于(或者大于)它的父节点。大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]二.实现package com.vincent.main;import java.uti原创 2020-06-02 13:56:50 · 269 阅读 · 0 评论 -
二叉树顺序存储与线索二叉树
一.顺序存储二叉树将二叉树存储在一个数组中,通过存储元素的下标反映元素之间的父子关系。按照二叉树结点自上向下、自左向右的顺序存储。使用此存储方式,结点的前驱和后继不一定是它们在逻辑上的邻接关系,非常适用于满二又树和完全二又树。顺序存储到数组中父节点与左右节点索引关系:二.线索化二叉树对于二叉链表,不管二叉树的形态如何,n个结点的二叉链表共有2n个链域,非空链域为n-1个(从根节点开始一个指针链接一个节点),故其中的空链域有n+1个。为提高空指针利用率提出了一种方法,利用原来的空链域存放指针,原创 2020-06-01 22:44:48 · 1021 阅读 · 0 评论 -
树
一.简介二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二.满二叉树一棵二叉树的结点要么是叶子结点,要么它有两个子结点(如果一个二叉树的层数为K(根节点层数为1),且结点总数是(2^k) -1,则它就是满二叉树。)三.完全二叉树若二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。四.总结在非空二叉树中,第i层的结点原创 2020-05-31 22:36:20 · 455 阅读 · 0 评论 -
插值查找
一.简介插值查找是根据查找关键字与查找表中最大、最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。根据开始、结束索引、查找值提前预判查找值可能的位置。二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int[] arr原创 2020-05-31 11:38:26 · 560 阅读 · 0 评论 -
基数排序
一.简介基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,它是将要排序的元素分配至某些“桶”中1.找到数据中最大的数据,计算数据位数2.依次取出数据从个位开始判断,把数据丢到对应桶中。把桶中的数据依次赋值到原始数组二.实现package com.vincent;import java.util.Arrays;public class Main { public static voi原创 2020-05-27 22:19:52 · 395 阅读 · 0 评论 -
归并排序
一.简介归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。即先使每个子序列有序,再使子序列间有序。二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int[] arr原创 2020-05-27 17:59:39 · 367 阅读 · 0 评论 -
快速排序
一.简介快速排序是对冒泡排序的一种改进。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{原创 2020-05-27 16:05:46 · 458 阅读 · 0 评论 -
希尔排序
一.简介如果插入排序中,较小的数比较靠后,则数据移动较多,效率也就相对较差。希尔排序是插入排序的一种(也称增量缩小排序),希尔排序把数据按一定增量分组,对每组数据使用插入排序,依次减小增量直到增量为1。原理:二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int原创 2020-05-26 20:12:45 · 402 阅读 · 0 评论 -
插入排序
一.简介插入排序把数据分为有序和无序2部分,遍历无序数据依次为数据找到在有序数据中的合理位置二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int[] arr = new int[32]; for(int i=0;i<arr.length;i++原创 2020-05-26 16:43:34 · 397 阅读 · 0 评论 -
选择排序
一.简介依次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起/始位置二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int[] arr = new int[32]; for(int i=0;i<arr.length;i++){原创 2020-05-25 18:38:12 · 434 阅读 · 0 评论 -
冒泡排序
一.简介冒泡排序就是比较相邻的两个元素,把小的元素往前调或者把大的元素往后调。二.实现package com.vincent;import java.util.Arrays;public class Main { public static void main(String[] args) throws Exception{ int[] arr = new int[32]; for(int i=0;i<arr.length;i++){原创 2020-05-25 16:30:32 · 380 阅读 · 0 评论 -
八皇后求解
一.简介八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。二.实现package com.vincent;import java.util.Arrays;public cla原创 2020-05-25 10:13:02 · 410 阅读 · 0 评论 -
中缀、后缀、前缀表达式
一.简介对于1+((2*3)-4)/2 的数学表达式怎么求值?分析:数学表达式求值有优先级,不能简单的从左往右依次计算, 需要从优先级高的开始计算二.中缀表达式运算符在数值间1+((2*3)-4)/2 ,数学表达式即为中缀表达式。从左往右遍历每个字符:1.字符是数值就入栈到数值栈中,是运算符就入栈到符号栈2.字符为运算符就和上一个运算符比较优先级(没有就直接入栈),小于上一个运算符优先级就出栈2个数值,出战1个运算符并计算结果入栈,再入栈当前运算符数学表达式解析完成后:从数值栈出栈2个数原创 2020-05-23 18:33:07 · 761 阅读 · 0 评论 -
栈(Stack)
一.简介栈是一种仅在表尾进行插入和删除操作的线性表(FILO)。操作的这一端被称为栈顶,另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。二.实现package com.vincent;import java.util.Arrays;import java.util.NoSuchElementException;public class Ar原创 2020-05-23 13:58:36 · 371 阅读 · 0 评论 -
约瑟夫问题求余(mod)解法
一.简介采用循环链表操作节点解决约瑟夫问题,需要自己定义一个循环链表,相对复杂java api 已经提供了许多容器类,ArrayList,LinkedList 等,完全可以使用这些容器加%运算解决二.实现package com.vincent;import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) throws Excep原创 2020-05-23 12:07:46 · 535 阅读 · 0 评论 -
约瑟夫问题环循环链表解法
一.简介据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进原创 2020-05-23 11:52:14 · 525 阅读 · 0 评论 -
双向链表
一.简介双向链表有2个指针,分别指向前一个结点、后一个节点。基本结构如下:二.实现package com.vincent;public class Main { public static void main(String[] args) throws Exception{ LinkedList<Integer> list = new LinkedList<>(); for(int i=0;i<32;i++){原创 2020-05-22 15:35:28 · 512 阅读 · 0 评论 -
单向链表
一.简介计算机对数据存储有顺序存储、链式存储。数组是一种顺序存储的体现,链表是链式存储的体现,很多高级数据结构都是基于链表实现。单向链表:数据元素通过一个指针指向下一个数据元素二.实现package com.vincent;public class Main { public static void main(String[] args) throws Exception{ LinkedList<Integer> list = new LinkedList原创 2020-05-21 21:32:16 · 398 阅读 · 0 评论 -
环形队列
一.简介每次数据出队后都把数据往前移动将是非常低效的,使用环形队列将大幅提高数据出队效率。使用front、rear 分别记录数据出队、入队索引位置,只有在队列满了之后才需要扩容移动数据二.实现package com.vincent;import java.util.Arrays;import java.util.NoSuchElementException;public class ArrayQueue<T> { private static final int DEF原创 2020-05-21 15:24:50 · 403 阅读 · 0 评论 -
队列Queue
一.简介先进先出:只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。即先添加的数据先获取,后添加的数据后获取。使用方向:1.数据排队2.BFS(广度优先搜索算法实现)3.消息队列二.实现package com.vincent;import java.util.Arrays;import java.util.NoSuchElementException;public class ArrayQueue<T> { private stat原创 2020-05-20 21:45:31 · 368 阅读 · 0 评论 -
稀疏数组(Sparse Array)
一.简介数组是非常常用的线性数据结构。稀疏数组可实现对有较多无效数据数组的压缩。原始数组——>稀疏数组:1.稀疏数组中第一行分别表示:原数组行数、列数、有效数据个数2.其余行分别记录原始数组中有效数据:行、列、有效值二.实现1.遍历原始数组中有效数据个数2.创建稀疏数组实现原始数组到稀疏数组的映射package com.vincent;import java.util.Arrays;public class Main { public static volatile原创 2020-05-20 19:53:00 · 904 阅读 · 0 评论 -
数据结构与算法概要
一.简介数据结构是指相互之间存在一种或多种特定关系数据元素的集合。一个或多个数据元素之间有一定的相互关系。算法是被计算机使用来解决问题的的方法。可简单视为一系列解决问题的指令,算法代表着用系统的方法描述解决问题的策略机制。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。图灵奖 Pascal之父——Niklaus Wirth 提出 “程...原创 2020-05-06 19:01:51 · 649 阅读 · 0 评论