JAVA学习
文章平均质量分 59
JAVA入门
瓜波牛排
这个作者很懒,什么都没留下…
展开
-
并查集运用
一看到这种求连通关系的就要想到使用并查集!腾讯例题:现在有10000000个用户,编号为1- 10000000,现在已知有m对关系,每一对关系给你两个数x和y,代表编号为x的用户和编号为y的用户是在一个圈子中,例如:A和B在一个圈子中,B和C在一个圈子中,那么A,B,C就在一个圈子中。现在想知道最多的一个圈子内有多少个用户。解答:import java.util.*;import java.util.Scanner;class UnionFind{ public sta.原创 2021-09-22 22:44:07 · 224 阅读 · 0 评论 -
《黑马程序员》— 图的入门
目录图的定义图的相关术语图的存储结构邻接矩阵邻接表无向图的实现图的搜索深度优先搜索(DFS)广度优先搜索(BFS)图的定义图是由一组顶点和一组能够将两个顶点相连的边组成的。特殊图:图可以分为无向图和有向图。有向图就是连接是有方向的。图的相关术语度: 某个顶点的度就是依附于该顶点的边的个数环: 是一条至少含有一条边且终点和起点相同的路径连通图: 如果图中任意一个顶点都存在一条路径到达另外一个顶点图的存储结构要...原创 2021-07-27 21:41:09 · 1385 阅读 · 0 评论 -
《黑马程序员》— 并查集(简介)
并查集是一种树型的数据结构,可以高效地做如下操作:(1)查询元素p和元素q是否属于同一组。(2)合并元素p和元素q所在的组。并查集的定义:1. 每个元素都唯一的对应一个结点; 2. 每一组数据中的多个元素都在同一颗树中; 3. 一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系; 4. 元素在树中并没有子父级关系的硬性要求; 并查集的应用举例:如果我们并查集存储的每一个整数表示的是一个大型计算机网络中的计算机,那么就可以判断,该网络中的某两.原创 2021-07-27 13:17:22 · 177 阅读 · 0 评论 -
《黑马程序员》— B和B+树
目录B树B树在磁盘文件中的应用B+树B+树和B树对比B+树的优点:B树的优点:B+树在数据库中的应用:二叉查找树、2-3树以及它的实现红黑树。2-3树中,一个结点最多能有两个key,它的实现红 黑树中使用对链接染色(红或黑)的方式去表达这两个key。B树而B树这种树型结构,一个结点允许多于两个key的存在。(1)每个结点最多有M-1个key,并且以升序排列; (2)每个结点最多能有M个子结点; (3)根结点至少有两个子结点;...原创 2021-07-27 00:05:44 · 182 阅读 · 0 评论 -
《黑马程序员》— 红黑树
目录红黑树的定义红黑树的API设计平衡化(旋转)左旋右旋红黑树的插入向单个2-结点中插入新键向底部的2-结点插入新键颜色反转向一个双键树中插入新键根结点的颜色总是黑色向树底部的3-结点插入新键前面介绍了2-3树这种平衡树,来避免二叉树插入元素在容易出现的不平衡现象。但是2-3树的实现过于复杂,所以就有了2-3树思想的简单实现:红黑树。红黑树的定义红黑树主要是对2-3树进行编码,红黑树背后的基本思想是用标准的二叉查找树(完全由2-结点构...原创 2021-07-25 23:46:07 · 2574 阅读 · 3 评论 -
回溯法入门
资料来源与致谢:https://leetcode-cn.com/u/carlsun-2/,公众号-代码随想录。回溯法(Backtracking) 是系统地搜索一个问题的所在解或任一解。回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。回溯算法模板框架如下:void backtracking(参数) { if (终止条件) { 存放结果; return;.原创 2021-07-17 20:44:22 · 229 阅读 · 0 评论 -
《黑马程序员》— 2-3查找树
2-3查找树定义二叉查找树有可能出现如下的极端情形。为了保证查找树的平衡性,=允许树中的一个结点保存多个键。确切的说,我们将一棵标准的二叉查找树中的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两个键和 三条链。2-3查找树的结点要么是2-结点,要么是3-结点。结点都是左小,右大。2-结点: 含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点:含有两个键(及其对应的值)和三条.原创 2021-07-13 23:25:13 · 237 阅读 · 0 评论 -
《黑马程序员》— 索引优先队列
前言上一个博客实现的最大优先队列和最小优先队列,他们可以分别快速访问到队列中最大元素和最小元素,但是他们有一个缺点,就是没有办法通过索引访问已存在于优先队列中的对象,并更新。为了实现这个目的,在优先队列的基础上,学习一种新的数据结构,索引优先队列。接下来我们以最小索引优先队列举列。 原理:以空间换时间,利用两个辅助数组来维护优先队列。实现步骤步骤一:存储数据时,给每一个数据元素关联一个整数,例如insert(int k,T t)。例如可以用一个T[] items数组来保原创 2021-07-07 12:44:13 · 268 阅读 · 2 评论 -
《黑马程序员》- 优先队列(最大or最小)
定义优先队列,顾名思义,队列中的元素有优先级。优先队列按照其作用不同,可以分为以下两种:(1)最大优先队列:可以获取并删除队列中最大的值最大优先队列:无论入队的顺序,当前最大的元素先出列。(2)最小优先队列:可以获取并删除队列中最小的值最小优先队列:无论入队的顺序,当前最小的元素先出列。最大优先队列堆这种结构是可以方便的删除最大的值,所以可以直接用堆结构实现最大优先队列。堆结构:https://blog.csdn.net/Amigo_1997/article/detail原创 2021-07-06 23:19:16 · 313 阅读 · 0 评论 -
《黑马程序员》 - 堆排序
例子:实现步骤:堆的构造:上述的方式虽然很直观,也很简单,但是我们可以用更聪明一点的办法完成它。创建一个新数组,把原数组 0~length-1的数据拷贝到新数组的1~length处,再从新数组长度的一半处开始往1索引处扫描(从右往左),然后对扫描到的每一个元素做下沉调整即可。(因为叶子节点不需要做下沉。)堆内排序:每次选一个堆顶元素,然后堆顶元素和最后一个元素交换,最后一个元素运行下沉算法(排除最后一个元素),循环。public class HeapSort {原创 2021-07-05 22:03:31 · 162 阅读 · 2 评论 -
《黑马程序员》—堆的定义
堆的定义堆可以被看做是一颗完全二叉树的数组对象。完全二叉树:往左边填结点,只有左边不满的时候才往右边填。堆的具体实现方法:将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子结点则分别在位置4,5,6和7如果一个结点的位置为k,则它的父结点的位置为[k/2](向下取整),而它的两个子结点的位置则分别为2k和2k+1。规定:每个结点都大于等于它的两个子结点。这里要注意堆中仅仅规定了每个结点大于等于它的两个子结点,但这两个子结点的顺序并没有做规定原创 2021-07-03 20:27:08 · 179 阅读 · 3 评论 -
《黑马程序员》—折纸问题
折纸问题:请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折 痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 分析思路:我们把对折后的纸张翻过来,让粉色朝下,这时把第一次对折产生的折痕看做是根结点,那第二次对折产生的下折痕就是该结点的左子结点,而第二次对折产生的上折痕就是该结点的右子结点,这样我们就可以使用树型数据结构来描述对折后产生的折痕。原创 2021-07-03 11:09:58 · 352 阅读 · 3 评论 -
《黑马程序员》-二叉树的层序遍历和二叉树的最大深度
二叉树的层序遍历例如: //层序遍历 public Queue<Key> layerErgodic() { Queue<Key> keys = new LinkedList<>(); Queue<Node> nodes = new LinkedList<>(); nodes.offer(root); while(!nodes.isEmpty()){原创 2021-07-03 10:14:28 · 140 阅读 · 1 评论 -
《黑马程序员》-二叉树的基础遍历(前中后)
三种排序方法都是先左再右,只是输出根结点的次序不同。PS:队列的基本操作 //前序遍历-获取整个树中所有的键 public Queue<Key> preErgodic(){ Queue<Key> keys = new LinkedList<>();; preErgodic(root, keys); return keys; } //前序遍历-获取指定树x的所有键,并放到k原创 2021-07-02 22:16:40 · 397 阅读 · 2 评论 -
《黑马程序员》-二叉树的构建(增删查)
由于网络的问题,在终端里直接输入pip install matplotlib会由于服务器超时而失败,只能手动安装了,到另外一台电脑中下载了matplotlib的安装包https://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.5.1/然后把安装包移植到所需的环境的路径中(这个一定要放好,如果是anaco...原创 2021-07-01 23:08:25 · 161 阅读 · 0 评论 -
《尚硅谷数据结构》-二叉树的遍历
目录二叉树为什么需要树这种数据结构二叉树的概念二叉树的遍历二叉树遍历代码实现二叉树为什么需要树这种数据结构数组存储方式的分析优点: 通过下标方式访问元素, 速度快。 对于有序数组, 还可使用二分查找提高检索速度。 缺点: 如果要检索具体某个值, 或者插入值(按一定顺序)会整体移动, 效率较低链式存储方式的分析 优点: 在一定程度上对数组存储方式有优化(比如: 插入一个数值节点, 只需要将插入节点, 链接到链表中即可,删除效率也很好)。 缺点: 在进行.原创 2021-04-12 22:06:50 · 291 阅读 · 0 评论 -
《尚硅谷数据结构》-哈希表
目录哈希表概念例题(使用哈希表来管理雇员信息)哈希表概念散列表(Hash table, 也叫哈希表) 是根据关键码值(Key value)而直接进行访问的数据结构。 也就是说, 它通过把关键码值映射到表中一个位置来访问记录, 以加快查找的速度。 这个映射函数叫做散列函数, 存放记录的数组叫做散列表。作用:例题(使用哈希表来管理雇员信息)有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的 id 时, 要求查找到该员工..原创 2021-04-10 17:36:42 · 292 阅读 · 0 评论 -
《尚硅谷数据结构》-查找算法
目录线性查找算法二分查找二分查找升级版(可以找到多个相同值)插值查找算法斐波那契(黄金分割法)查找算法在 java 中, 常用的查找有四种:顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找线性查找算法public class SeqSearch { public static void main(String[] args) { int arr[] = {1, 9, 11, -1, 34, 89}; int...原创 2021-04-09 22:41:23 · 209 阅读 · 0 评论 -
《尚硅谷数据结构》-基数排序
目录基数排序基本思想代码实现基数排序基本思想将所有待比较数值统一为同样的数位长度,数位较短的前面补零。然后从最低位开始,依次进行一次排序。基数排序是经典的用空间换时间的排序算法。实例—按个位数排序按十位数排序按百位数排序基数排序的轮次等于最大位数代码实现import java.util.Arrays;public class RadixSort { public static void main(String[] args) {原创 2021-03-22 16:13:24 · 208 阅读 · 0 评论 -
《尚硅谷数据结构》-归并排序
归并排序的概念归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治(divide-and-conquer)策略。分治策略中的分,是指把问题分成一些小的问题,然后递归求解;治是把分这个阶段得到的各个答案“修补”在一起。(需要构造一个temp数组,所以空间复杂度高)代码实现import java.util.Arrays;public class MergeSort { public static void main(String[] args) { .原创 2021-03-22 15:08:16 · 426 阅读 · 0 评论 -
《尚硅谷数据结构》-快速排序
目录快速排序概念代码实现(中值为pivot)(不推荐)代码实现(第一个值为pivot)代码实现(最后一个值为pivot)快速排序概念快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将数据分成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(基准值的选择有很多,比如第一个数,最后一个数,或者数组的中间值)基准值就是Pivot中心轴,建议选择第一个数为中心轴原创 2021-03-20 16:58:06 · 538 阅读 · 0 评论 -
《尚硅谷数据结构》-希尔排序
目录希尔排序介绍希尔排序(交换式)希尔排序(移动式)希尔排序介绍希尔排序也是一种插入排序算法,它是简单插入排序改进后的一个更高效的版本,也称为缩小增量排序。基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,最后再排序。举例—移动式的希尔排序效率比交换式的希尔排序效率高。希尔排序(交换式)import java.util.Arrays;publi原创 2021-03-19 22:45:31 · 242 阅读 · 1 评论 -
《尚硅谷数据结构》-插入排序
目录插入排序优化版本插入排序插入排序的基本思想:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它插入到有序表中的适当位置。public class InsertSort { public static void main(String[] args) { int[] arr = {101, 34, 119, 1}; insertSort(arr);原创 2021-03-18 23:52:34 · 182 阅读 · 1 评论 -
《尚硅谷数据结构》-冒泡排序和选择排序
目录冒泡排序选择排序冒泡排序冒泡排序(Bubble Sorting) 的基本思想是: 通过对待排序序列从前向后(从下标较小的元素开始) ,依次比较相邻元素的值(两两比较), 若发现逆序则交换, 使值较大的元素逐渐从前移向后部, 就像水底下的气泡一样逐渐向上冒。冒泡排序规则(1)一共进行 数组大小-1 次的大循环(2)每一趟排序的次数在逐渐减少(3)如果在某趟排序中,没有发生一次交换,则可以提前结束import java.util.Arrays;public clas原创 2021-03-15 19:13:43 · 235 阅读 · 0 评论 -
《尚硅谷数据结构》-排序算法总结与介绍
目录排序算法的介绍算法的时间复杂度例子举例平均时间复杂度和最坏时间复杂度空间复杂度排序算法的介绍排序算法是将一组数组,依指定的顺序进行排列的过程。排序算法分为两类:(1)内部排序:将需要处理的所有数据都加载到内部存储器(内存)中进行排序。(2)外部排序:当数据量过大时,无法全部加载到内存中,需要借助外部存储(如文件)进行排序。常见的排序算法分类:(8种常见-直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序)算法的时间复杂度 事后统计的原创 2021-03-14 14:53:00 · 191 阅读 · 0 评论 -
《尚硅谷数据结构》-递归
递归的概念递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。public class RecursionTest { public static void main(String[] args) { test(4); } public static void test(int n) { if (n > 2) { test(n - 1);原创 2021-03-11 22:49:15 · 232 阅读 · 0 评论 -
《尚硅谷数据结构》-栈
目录栈的概念栈的快速入门使用数组来模拟栈使用单向链表来模拟栈栈的概念栈(stack)是一个先入后出的有序列表。栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表。栈顶(Top):允许插入和删除的一端。栈底(Bottom):固定的一端,不变化。出栈-pop入栈-push所以最先放入的元素会到栈底,最后放入的元素会到栈顶。栈的应用场景子程序的调用: 在跳往子程序前, 会先将下个指令的地址存到堆栈中, 直到子程序执行完后再将地址取出, 以.原创 2021-03-10 20:01:28 · 310 阅读 · 0 评论 -
《尚硅谷数据结构》-双向链表和单向环形链表
目录双向链表单向环形链表双向链表双向链表要注意区分是否是尾节点的情况public class DoubleLinkedlistDemo { public static void main(String[] args) { //创建节点 HeroNode_2 hero1 = new HeroNode_2(1,"宋江","及时雨"); HeroNode_2 hero2 = new HeroNode_2(2,"卢俊义","玉麒麟原创 2021-03-09 23:29:30 · 180 阅读 · 0 评论 -
《尚硅谷数据结构》-单向链表面试题练习
目录求单链表中节点的个数查找单链表中的倒数第k个节点单链表的反转从尾到头打印单链表合并两个有序的单链表求单链表中节点的个数 //获取单链表的节点个数(如果有头节点,则不统计头节点) public int getLength(HeroNode headNode){ if(headNode.next == null){ return 0; } int length = 0; Her原创 2021-03-08 21:33:12 · 188 阅读 · 0 评论 -
《尚硅谷数据结构》-单向链表
目录链表的概念单向链表的应用举例第一种方法第二种方法链表的概念链表是有序的列表,但是在内存中的存储不一定是连续的。 单向链表的应用举例使用带 head 头的单向链表实现 – 水浒英雄排行榜管理完成对英雄人物的增删改查操作第一种方法添加(创建):先创建一个head 头节点, 作用就是表示单链表的头 后面我们每添加一个节点,就直接加入到 链表的最后遍历:通过一个辅助变量遍历,帮助遍历整个链表package queue;publi...原创 2021-03-07 23:32:14 · 239 阅读 · 1 评论 -
《尚硅谷数据结构》-数组模拟队列
目录队列的介绍数组模拟队列数组模拟环形队列队列的介绍队列是一个有序列表,可以用数组或链表实现。队列是先入先出,即先存入队列的数据,要先取出。数组模拟队列使用数组模拟队列示意图—第一个是初始队列,第二个是存数据(从上面进),第三个是取数据(从下面出)(但是这样是一次性的队列)MaxSize是队列的最大容量,变量rear会随着数据的输入而改变,而变量front会随着数据的输出而改变。// 使用数组模拟队列-ArrayQueue类class ArrayQueue{原创 2021-03-06 20:03:37 · 162 阅读 · 0 评论 -
《尚硅谷数据结构》-稀疏数组
目录一、数据结构二、稀疏数组的概念三、二维数组和稀疏数组的转换一、数据结构数据结构分为 线性结构 和 非线性结构线性结构:数据元素之间存在一对一的线性关系,例如数组、队列、链表和栈。线性结构又分为顺序存储和链式存储,其中链式存储中的元素不一定是连续的。非线性结构:二维数组、广义表、树结构、图结构。二、稀疏数组的概念稀疏数组的处理方法是:记录数组一共有几行几列, 有多少个不同的值 把具有不同值的元素的行列及值记录在一个小规模的数组中, 从而缩小程序的规模.原创 2021-03-05 23:00:02 · 180 阅读 · 0 评论 -
《黑马程序员》Java-反射
目录反射的基本概念获取字节码的三种方式反射获取构造方法反射获取成员方法反射获取成员变量反射的基本概念反射的定义:在程序运行过程中分析类的一种能力。正常情况:反射:反射的作用(1)分析类。加载并初始化一个类,查看类的所有属性和方法。(2)查看并使用对象。查看一个对象的所有属性和方法,使用对象的任意属性和方法。反射的应用场景1、构建通用的工具2、搭建具有高度灵活性和扩展性的系统框架3、逆向工程中常用反射获取字节码的三种方式.原创 2021-03-05 20:54:54 · 345 阅读 · 0 评论 -
《JAVA300集》网络编程_聊天室案例-day26
聊天室案例原创 2021-01-20 23:49:42 · 165 阅读 · 3 评论 -
《JAVA300集》网络编程_协议层-day25
目录网络编程-协议层1.UDP协议和TCP协议UDP协议TCP协议2.UDP编程简单数据-发送端简单数据-接受端基本类型-发送端基本类型的接收端在线咨询功能3.TCP编程概念介绍熟悉流程网络登录功能实现网络编程-协议层1.UDP协议和TCP协议UDP是用户数据报协议的简称,TCP是传输控制协议。两者都是传输层的重要的高级协议。UDP协议UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计..原创 2021-01-19 20:35:47 · 142 阅读 · 0 评论 -
《JAVA300集》网络编程_入门概念-day24
目录网络编码_入门1.基本概念2.IP地址3.端口4.URL5.爬虫基本原理6.传输协议网络编码_入门1.基本概念(1)网络编程强调的是底层,如TCP、UDP,网页编程强调的是应用,如JSP。(2)网络重要的两个元素:1.通讯协议 2.通信接口。(3)网络分层。1. OSI(Open System Interconnect)参考模型- 开放系统互连参考模型,一共分为7层(OSI参考模型-理论标准)发送数据的处理方式:是从高层到底层,逐层进行数据.原创 2021-01-17 22:33:44 · 148 阅读 · 0 评论 -
《JAVA300集》多线程_高级主题-day23
目录多线程-高级主题1.定时调度2.HappenBefore3.volatile4.单例模式5.ThreadLcoal6.可重入锁7.CAS多线程-高级主题1.定时调度import java.util.Calendar;import java.util.GregorianCalendar;import java.util.Timer;import java.util.TimerTask;/** 任务定时调度* */public class M原创 2021-01-15 22:40:05 · 161 阅读 · 1 评论 -
《JAVA300集》多线程_并发协作-day22
目录一、死锁死锁示例避免死锁二、线程协作-生产者消费者模式理论三、管程法四、信号灯法一、死锁死锁的概念:多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致多个线程都在等待对方释放资源,而都停止执行的现象。某一个同步块同时拥有"两个以上对象的锁"时,就可能发生“死锁”的问题。死锁示例package Thread;/** 死锁现象* */public class DeadLock { public static void原创 2021-01-13 22:28:45 · 128 阅读 · 0 评论 -
《JAVA300集》多线程_并发基础案例-day21
一、并发与线程同步并发:同一个对象的多个线程同时操作。并发有可能引发线程不安全的问题。线程同步是一种等待机制,用于解决线程不安全问题。当多个线程访问同一个对象,并且某些线程还想修改这个对象。这时候就可以通过线程同步方法。多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕后,下一个线程再使用。二、锁机制为了保证数据在多线程访问中的正确性,在访问时加入了锁机制(synchronized),当一个线程获得对象的排它锁,就可以独占资源,其他线程必须等待,这个线程原创 2021-01-12 23:26:29 · 207 阅读 · 0 评论 -
《JAVA300集》多线程_基础-day20
目录多线程静态代理设计模式Lambda表达式简化线程线程状态终止线程的典型方式暂停线程执行线程的联合线程的常用方法线程的优先级守护线程多线程静态代理设计模式之前讲通过Runnable接口启动多线程的操作,需要借助thread类的对象,这个thread类可以成为静态代理。静态代理:这个类是提前写好的,可以直接拿来用。动态代理: 这个类是在运行过程中,动态构建出来的,可以理解为临时构建出来的。/** 静态代理* 公共接口:* 1、真实角色原创 2021-01-09 23:14:54 · 185 阅读 · 0 评论