
数据结构和算法
Java描述的数据结构和算法
小小绿豆
一枚热爱code的小绿豆
展开
-
算法问题: 为啥idea的全局搜索这么快?idea的冗余代码检测怎么实现的?
idea是程序员常用的开发工具,今早有同事突然问起来,idea能不能搜索windows其他文件内容,因为idea的文本搜索能力确实很强,基本上做到了整个项目里面的文本内容秒级搜索。然后我思考了下这两个问题:1.为啥idea的全局搜索这么快?idea的常用操作:全局搜索 Ctrl + Shift + F,可以对整个项目的任意文本做秒级搜索,定位到关键字所在的文件list、所在文件位置(代码行数);2.idea的冗余代码检测怎么实现的?方法的重用,一直是高质量代码里面的一条标准,如果代码出现大...原创 2021-06-03 14:18:04 · 1780 阅读 · 5 评论 -
《算法4》加权有向图最短路径算法(Dijkstra算法)
Dijkstra算法原理:s到w顶点,可以通过其他顶点中转到达并缩短距离,就松弛s到w的路径;demo中使用的测试数据,来自《算法4》:《算法4》配图里面的最短路径权重数据有小许误差,可自行手动验证看下:用到的数据结构:邻接边类 DirectedEdge.java/** * 边的对象 * * @author ltx */public class DirectedEdge implements Comparable<DirectedEdge> { p.原创 2021-04-28 16:10:41 · 856 阅读 · 0 评论 -
《算法4》加权无向图最小生成树算法(Prime算法(延时实现) | Prime算法(即时实现) | Kruskal)
《算法4》最小生成树3种算法原理:Prime算法(延时实现):将mst里面顶点的邻接边集合的最小边加入最小生成树mst,并延迟删除2个顶点都已经标记的边;Prime算法(即时实现):距离最近的顶点加到最小生成树mst里面,并修改距离w顶点到最小生成树mst的的距离;Kruskal:将邻接边集合的最小边加入最小生成树mst,加入的边不形成环(union-find并查集算法检测);各种最小生成树算法的性能特点demo中使用的测试数据,来自《算法4》,配图这里有个小的错误,看的时候注意一下。.原创 2021-04-27 10:22:10 · 415 阅读 · 0 评论 -
《算法4》union-find并查集算法 (quick-find | quick-union | 加权quick-union | 路径压缩的加权quick-union)
union-find并查集算法,是高效的动态连通算法,在判断无向图中的连通分量效率很高;文章中的算法和图片均来自《算法4》结合之前《无向图-连通分量》算法,暂目前无向图连通分量的2种算法:算法1:通过深度优先遍历算法从未标记的顶点开始遍历,遍历完无向图中的所有顶点,得到连通分量;算法2:使用union-find并查集算法,动态连通算法,得到连通分量;区别:算法1需要初始化逐个遍历整个图,效率低,但可以利用图的数据结构;算法2可以动态得到连通分量,效率高;在只关心连通分量的情况下,un..原创 2021-04-26 18:23:04 · 828 阅读 · 0 评论 -
《算法4》有向图 (二、有向无环图(DAG) | 拓扑排序 | 强连通分量(Kosaraju))
基于《算法4》的描述,在之前有向图数据结构基础上,实现有向无环图(DAG)、拓扑排序、强连通分量(Kosaraju)算法;一些概念有向无环图(DAG):不含有环的有向图;拓扑排序: 给定一幅有向图,使得有向边均从排在前面的元素指向排在后面的元素; 当且仅当,有向无环图才可以做拓扑排序; 常用于任务调度、课程安排...等解决方案;强连通分量(Kosaraju): 顶点v和顶点w互相可达为连通性; 顶点之间可达的最大子集,就是强连通分量;一、有向无环...原创 2021-04-23 16:13:40 · 1003 阅读 · 0 评论 -
《算法4》无向图、有向图 (一、深度优先 | 广度优先 | 连通分量 | 可达性分析 | 最短路径)
图的结构和算法很常用,基于《算法4》中的描述,总结手撕了一波;包含以下图的基础算法:无向图:深度优先遍历、广度优先遍历、连通分量、最短路径;有向图:深度优先遍历、广度优先遍历、可达性分析、最短路径;一些概念图:顶点和边构成;自环:一条连接一个顶点和其自身的边;平行边:连接同义对顶点的两条边;连通分量(无向图):互相连通的顶点;可达性(有向图):一个顶点可以到达另外一个顶点;最短路径:一个顶点连通(到达)另外一个顶点最少需要走过的顶点集合;二分图:能够将所有节点分为两部分的图..原创 2021-04-20 21:40:52 · 2042 阅读 · 1 评论 -
字典树(Trie)
字典树(Trie)是一种空间换时间的字典搜索算法,很适合做字典类数据的搜索和统计;此demo算法,包含字典树Trie的单词添加、删除、遍历、查找;demo中测试数据:注:此demo测试数据仅限于小写字母表的单词,遂,这段话入字典表前做了大写转换小写;节点类 Node.java/** * @Author: ltx * @Description: */public class Node { //字符值 public char value; //单词..原创 2021-04-20 21:06:44 · 256 阅读 · 1 评论 -
赫夫曼编码—数据压缩算法
赫夫曼编码是一种无前缀的压缩算法,原理是将字符按权重生成赫夫曼树,赫夫曼树特点是WPL最小,字符位于叶子节点,保证权重大(出现次数多)的字符离根节点进,对字符做二进制编码,具体压缩和解压过程:压缩:1.原始字符串-->各个字符出现次数(权重),字符权重List;2.字符权重List-->赫夫曼树;3.赫夫曼树-->赫夫曼编码表;4.赫夫曼编码-->压缩编码;解压:压缩编码-->匹配赫夫曼编码,得到原始数据;核心是利用赫夫曼树的特点:1.WPL值最小;2..原创 2021-04-20 00:20:37 · 1170 阅读 · 1 评论 -
AVL平衡二叉树
AVL平衡二叉树:是一颗二叉排序树,并且左右两个子树的高度差的绝对值不超过1;AVL平衡二叉树可以进行高效的数据查找,最差的情况下查找一个数据时间复杂度为log2n,是二叉树结构里面单点数据查询最快的结构;以下demo在之前章节《BST二叉排序树》的算法基础上实现的;基本的4种需要平衡情况:LL:root.left树高>root.right树高,且root.left.left树高>root.left.right树高,执行root节点的右旋操作;LR:root.left树.原创 2021-04-14 23:30:14 · 163 阅读 · 0 评论 -
BST二叉排序树
BST二叉排序树:又称二叉查找树,它是一种对排序和查找都很有用的特殊二叉树;满足data.key > lchild.key > data.key,即节点值大于左子树值小于右子树值;BST二叉排序树很多高级数据结构和算法的基础,比如AVL平衡二叉树、Red-Black红黑树...以下demo基本包含了BST二叉排序树的添加、删除、查找、前序遍历(递归和非递归)、中序遍历(递归和非递归)、后续遍历(递归和非递归)方法:demo中用到的测试用例数据节点类 TreeNode.ja..原创 2021-04-14 11:23:42 · 469 阅读 · 0 评论 -
BinarySearch二分查找—非递归和递归实现
BinarySearch二分查找是一种针对有序数据很高效的查找算法;以下demo基本包含二分查找的非递归和递归实现:二分查找类 BinarySearch.java/** * @Author: ltx * 二分查找算法 */public class BinarySearch { /** * 二分查找-非递归实现 * * @param arr 数组 * @param value 值 * @return 下标 */..原创 2021-04-14 11:18:01 · 216 阅读 · 0 评论 -
约瑟夫环问题—双指针链表解决、数组取模解决
num个人围成一圈,从start位置开始报数,每报到step的人就出局,直到剩下最后一人双指针链表方式解决JosephLinked.java/** * 节点 */class SignLinkedNode implements Serializable { public Integer value; //下一个节点 public SignLinkedNode next; public SignLinkedNode() { } publ...原创 2021-04-13 20:54:15 · 411 阅读 · 0 评论 -
手写简易hash结构—数组+链表实现
hash是很多高级数据结构和算法的基础,比如集合的HashMap、HashTable...以下demo实现了一个简易的hash结构:这里链表需要引入单向链表,具体查看另外一篇文章《单向链表》import com.xxx.xxx.SignLinked;import com.xxx.xxx..SignLinkedNode;hash实现:数组+链表 MyHash.java/** * hash结构 */public class MyHash { //链表数组 p..原创 2021-04-13 18:36:05 · 166 阅读 · 0 评论 -
栈应用—字符串括号匹配问题
利用栈,可以解决一些算法问题,比如括号匹配、逆波兰表达式...以下demo,解决括号匹配问题:BracketStr.java/** * @Author: ltx * @Description: 栈应用-字符串括号匹配问题 */public class BracketStr { private static Boolean isValid(String str) { //拆成char[] char[] chars = str.toCharA..原创 2021-04-13 18:13:27 · 163 阅读 · 0 评论 -
栈—数组实现、链表实现
栈是很多高级数据结构和算法的基础,比如集合的Stack...以下demo基本包含了栈的基本方法:栈-数组实现 ArrayStack.java/** * @Author: ltx * @Description: 栈-数组实现 */public class ArrayStack { private int[] arr;//数组 private int maxSize;//栈大小 private int size;//栈元素数量 private int i.原创 2021-04-13 18:08:49 · 84 阅读 · 0 评论 -
队列—普通队列(数组实现)、环形队列(数组实现)、链表实现
队列是很多高级数据结构和算法的基础,比如集合的List、Queue...以下demo基本包含了队列的基本方法:普通队列-数组实现 ArrayQueueCommon.java/** * @Author: ltx * @Description: 普通队列-数组实现 */public class ArrayQueueCommon { private int[] arr; private int maxSize;//队列大小 private int head;//头.原创 2021-04-13 17:56:45 · 138 阅读 · 0 评论 -
双向链表
双向链表是很多高级数据结构和算法的基础,比如队列、栈、图、哈希...以下demo基本包含了双向链表的增删改查:节点类DoubleLinkedNode.java/** * 双向链表节点 */public class DoubleLinkedNode implements Serializable { //节点值 public Integer value; //前置节点 public DoubleLinkedNode pre; //下一个节点...原创 2021-04-13 17:28:45 · 91 阅读 · 0 评论 -
单向链表
单向链表是很多高级数据结构和算法的基础,比如队列、栈、图、哈希...以下demo基本包含了单向链表的增删改查:节点类SignLinkedNode.java/** * 单向链表节点 */public class SignLinkedNode implements Serializable { public Integer value; //下一个节点 public SignLinkedNode next; public SignLinkedNode...原创 2021-04-13 17:24:28 · 101 阅读 · 0 评论 -
十种排序算法
结合各种资料,自己手撕常见10中排序算法;/** * @Author: ltx * @Date: 2021/3/30 * @Description: 10种排序算法 */public class SortTen { /** * 随机n长度的数组 * * @param min 最小值 * @param max 最大值 * @param n 数组长度 * @return */ public ..原创 2021-04-07 19:29:22 · 160 阅读 · 1 评论 -
稀疏数组
直接上代码/** * @Author: ltx * @Date: 2021/3/29 * @Description: 稀疏数组 */public class SparseArray { /** * 打印二维数组 * * @param arr 二维数组 */ private static void printTwoDimension(int[][] arr) { for (int[] row : arr) {原创 2021-04-07 19:38:18 · 97 阅读 · 0 评论