数据结构与算法
文章平均质量分 60
学习数据结构与算法
参考书籍:算法(第四版)
小游子YKY
宽和慈善,不忤于物,进退沉浮,自得而已。
展开
-
【数据结构-Java】实现二叉树
能提高数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也 可以保证数据的插入,删除,修改的速度。二叉树的子节点分为左节点右节点每个节点最多只能有两个子节点1)节点:节点对象2)根节点:3)父节点4)子节点5)叶子节点:没有子节点的节点6)节点的权:(节点的值)7)路径:从根节点找到该节点的路线8)层:9)子树:10)树的高度:11)森林:多棵子树构成的森林满二叉树:如果该二叉树的所有叶子节点都在最后.原创 2021-07-21 11:30:22 · 265 阅读 · 1 评论 -
【数据结构-Java】平衡二叉树(AVL树)
文章目录1、基本介绍2、应用案例-单旋转(左旋转)1) 数列2) 思路分析3)代码3、应用案例-单旋转(右旋转)1)需求2)思路分析3)图解4、应用案例-双旋转1) 问题分析2) 解决思路分析3)代码4)测试5、AVL完整代码1、基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过****1,并且左右两个子树都是一棵 平衡二叉树。平衡二原创 2021-05-27 23:02:30 · 2113 阅读 · 43 评论 -
【数据结构-Java】Java实现赫夫曼树
文章目录1、赫夫曼树基本介绍2、赫夫曼树几个重要概念和举例说明3、赫夫曼树创建思路图解4、赫夫曼树的代码实现1、赫夫曼树基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度**(wpl)**,达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近2、赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路原创 2021-05-15 22:28:56 · 561 阅读 · 0 评论 -
【数据结构-Java】赫夫曼编码
文章目录1、基本介绍2、原理剖析1)通信领域中信息的处理方式1-定长编码2)通信领域中信息的处理方式2-变长编码3)通信领域中信息的处理方式3-赫夫曼编码1、基本介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在 20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码原创 2021-05-15 22:26:42 · 657 阅读 · 0 评论 -
【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)
文章目录一、需求二、步骤1、创建赫夫曼树所需的节点Node2、得到字符串的byte数组3、接受字节数组返回list4、通过list返回一棵赫夫曼树5、生成赫夫曼树对应的赫夫曼编码表6、对赫夫曼树得到的二进制字符通过赫夫曼编码表进行数据压缩一、需求将给出的一段文本,比如 “i like like like java do you like a java” , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理二、步骤根据赫夫曼编码压缩数据的原理,需要创建 “i like like like java原创 2021-02-23 15:03:55 · 1728 阅读 · 6 评论 -
【数据结构-Java】二叉排序树
文章目录1、二叉排序树介绍2、构建二叉排序树3、二叉排序树删除节点4、完整代码1、节点类2、二叉排序树类1、二叉排序树介绍二叉排序树BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:2、构建二叉排序树 /** * 添加节原创 2021-02-02 21:53:28 · 640 阅读 · 0 评论 -
数据结构与算法:约瑟夫问题(循环链表解决)
约瑟夫问题(循环链表解决)原创 2021-01-11 20:47:59 · 1073 阅读 · 0 评论 -
数据结构第二谈:数组模拟队列、数组模拟环形队列
数据结构第二谈:数组模拟队列、数组模拟环形队列1、数组模拟队列2、数组模拟环形队列原创 2021-01-08 17:49:42 · 644 阅读 · 6 评论 -
数据结构第一谈:单链表双向链表的实现(基于Java)
单链表双向链表基于Java的单链表双向链表实现原创 2021-01-06 23:39:17 · 2653 阅读 · 3 评论 -
排序算法第四谈:基数排序
一、思想基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(m)),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。二、图解过程三、核心代码 /** * 基数排序 * 构造一个桶,每个数原创 2021-01-05 21:52:12 · 1286 阅读 · 1 评论 -
排序算法第三谈:归并排序
归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。思想:归并排序是用分治思想,分治模式在每一层递归上有三个步骤:分解:将n个元素分成个含n/2个元素的子序列。解决:用合并排序法对两个子序列递归的排序。合并:合并两个已排序的子序列已得到排序结果。 /** * @param a.原创 2021-01-03 23:26:29 · 756 阅读 · 0 评论 -
排序算法第二谈:快速排序
思路把一个数组切分成两个子数组的基本思想:找一个基准值,用两个指针分别指向数组的头部和尾部;先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;交换当前左边指针位置和右边指针位置的元素;重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。public static void quickSort(int[] arr, int left, int right) { if (原创 2021-01-02 22:01:23 · 1755 阅读 · 2 评论 -
排序算法第一谈:希尔排序
希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。思想:将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当 gap=1时,利用直接插入,完成排序。同样的:从上面的描述中我们可以发现:希尔排序的总体实现应该由三个循环完成:第一层循环:将gap依次折半,对序列进行分组,直到gap=1第二、三层循环:也即直接插入排序所需要的两次循环。移位法 public static void shel.原创 2021-01-01 11:40:44 · 1822 阅读 · 2 评论 -
第一次尝试leetcode刷题,突然发现算法题也没有想象中的那么困难
文章预览:题一:给定一个未经排序的整数数组,找到最长且连续的的递增序列。题二:一个长度为n-1的递增排序数组中的所有数字都是唯一的, 并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中, 请找出这个数字。题三: 学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。题一:给定一个未经排序的整数数组,找原创 2020-05-30 20:49:29 · 9782 阅读 · 33 评论 -
程序员必知必会十大算法(一)
文章预览:1、二分算法2、分治算法(解决汉诺塔问题)3、动态规划(解决0-1背包问题)4、暴力匹配算法5、KMP算法:1、二分算法进行二分查找的数组必须是有序的二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1;递归实现二分查找: /** * 递归实现 * * @param arr * @param left * @param right * @param index * @return原创 2020-05-25 19:52:22 · 6586 阅读 · 2 评论 -
图的广度VS深度
深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:把根节点压入栈中。每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。找到所要找的元素时结束程序。如果遍历整个树还没有找到,结束程序。 广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:把根节点放到队列的末尾。每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱找到所要原创 2020-05-24 20:09:40 · 4455 阅读 · 0 评论 -
图的深度优先遍历
深度优先遍历,也称作深度优先搜索,缩写为DFS深度优先遍历从某个顶点出发,访问此顶点,然后从v的未被访问的邻接点触发深度优先便利图,直至所有和v有路径想通的顶点都被访问到。这样我们一定就访问到所有结点了吗,没有,可能还有的分支我们没有访问到,所以需要回溯(一般情况下都设置一个数组,来记录顶点是否访问到,如果访问到就不执行DFS算法,如果未被访问过就执行DFS算法)基本思路:从图中某顶点v出发: 1. 访问顶点v; 2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相原创 2020-05-24 19:45:57 · 4520 阅读 · 0 评论 -
【数据结构】手写AVL树
在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是{\displaystyle O(\log {n})}O(\log{n})。增加和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡原创 2020-05-20 23:07:28 · 3808 阅读 · 1 评论 -
顺二差查找(顺序、二分、插值查找)
1.查找算法概述 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实*二分查找*、*插值查找*以及*斐波那契查找*都可以归为一类——插值查找。插值查找和斐波那契查找是在二分查找的基础上的优化查找算法。(1)查找定义根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。(2)查找算法分类 1)静态查找和动态查找 注:静态或者动态都是针对查找表而言的。动态表指原创 2020-05-20 22:43:58 · 3222 阅读 · 0 评论 -
链表的实现
链表的创建//链表的管理class SingleLinked {Node HeadNode = new Node(0, “”, “”);//增加数据public void add(Node node) {Node temp = HeadNode;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = node;}//按顺序添加节点public void addByOrder(Node原创 2020-05-11 20:54:19 · 785 阅读 · 0 评论 -
查找单链表中的倒数第k个节点
#####思路:1)获取单链表的总个数;2)总个数与K之差即为从头结点开始计数的第()个节点;3)遍历获取;#####代码实现: //查找单链表中的倒数第k个节点 public int getRecipNode(int k) { if (HeadNode.next == null) { throw new RuntimeException("链表为空"); } Node t原创 2020-05-11 21:06:57 · 977 阅读 · 0 评论 -
栈的应用:表达式求值
中缀表达式转后缀表达式: 1)初始或两个栈:运算符栈s1和存储中间结果的栈s2; 2)从左至右扫描中缀表达式; 3)遇到操作数时,直接压s2; 4)遇到运算符时,与s1栈顶元素比较优先级; 1、如果s1为空,或者栈顶运算符为"(",则直接入栈; 2、否则,若优先级比栈顶运算符的高,也压入s1; 3、否则,将s1栈顶的运算符弹出并压入到s2中,再次转到4.1与s1新的栈顶运算符进行比较; 5)遇到括号时: 1、如果是“(”,则直接压入s1 2、如果时”)“,则依次弹出s1的栈顶运原创 2020-05-11 21:23:15 · 917 阅读 · 0 评论 -
用数组实现环形队列
public class CircleArray { private int maxSize; private int front;//环形队列中,front表示队列中的第一个元素; private int rear;//队列中最后一个元素的后一个位置 private int[]arr;//模拟环形队列 //创建队列 public CircleArray(int maxSize) { this.maxSize = maxSize;原创 2020-05-11 21:28:00 · 633 阅读 · 0 评论 -
数组实现栈
public class ArrayStark { private int maxSize;//栈容量 private int top = -1;//表示栈顶 private int[]stack; public ArrayStark(int maxSize) { this.maxSize = maxSize; stack = new int[maxSize]; } //判空 ..原创 2020-05-11 21:30:47 · 1047 阅读 · 1 评论