自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 Java SE——Java后端基础知识(超多超多)

该篇博客将展示Java基础知识,包括Java里的变量、数据类型、Java的组织形式、运算符、标识符、程序控制结构、数组、面向对象编程、成员属性、成员方法、构造器、IDEA使用技巧(常见快捷键!)、Java命名规范、封装、继承、多态、接口实现、动态绑定机制、类变量、类方法(静态方法)、代码块、抽象类。以及对数据库:Mysql、表的增删改查、SQL语言的数据类型、SQL指令、多表查询、自连接、子查询临时表、主键、外键、函数、索引、事务管理、事务的提交、隔离级别;JDBC和数据库连接池、JDBC工具类;

2024-04-15 21:36:22 310

原创 算法——马踏棋盘算法(骑士周游问题)/图的深度优先遍历+贪心算法优化

马踏棋盘算法也叫骑士周游问题,其要求是:将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则()进行移动。要求,走遍棋盘上全部 64 个方格。

2024-04-13 16:14:34 615 1

原创 算法——弗洛伊德(Floyd)算法

1) 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于的算法。2) 弗洛伊德算法(Floyd)计算图中3)用于计算图中顶点到其他顶点的最短路径。4) 弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中,所以需要将每一个顶点看做被访问顶点,求出从每 一个顶点到其他顶点的最短路径。

2024-04-13 14:03:56 804

原创 算法——迪杰斯特拉(Dijkstra)算法

迪杰斯特拉常用于,用于计算一个节点到其他节点的最短路径。思想,主要特点:以起始点为中心,向外层扩展,直到扩展到终点为止。

2024-04-12 22:52:34 648

原创 常见算法——克鲁斯卡尔算法(Kruskal)、最小生成树

1) 克鲁斯卡尔(Kruskal)算法,是求加权连通图的最小生成树的算法。2) 基本思想:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路3) 具体做法:首先构造一个只含 n 个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。

2024-04-12 20:15:02 1713

原创 常见算法——普里姆算法(Prim)、最小生成树(Minimum Cost Spanning Tree (MST))

1) 胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通2) 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里3) 问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路:尽可能的选择少的路线,并且每条路线最小,保证总里程数最少.上述问题就是最小生成树问题,我们下面用普里姆算法解决。

2024-04-12 12:08:17 520

原创 常见算法——贪心算法(贪婪算法) Greedy algorithm

假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。如何选择最少的广播台,让所有 的地区都可以接收到信号。

2024-04-12 10:00:50 961

原创 字符串匹配算法——暴力匹配算法、KMP算法

1) KMP 是一个解决模式串在文本串是否出现过,如果出现过,获取最早出现的位置。2) Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发。3) KMP 算法:利用之前判断过信息,通过一个next 数组。

2024-04-11 21:53:49 977

原创 常见算法——动态规划算法(Dynamic Programming)

背包问题分为01背包和完全背包,01背包指每个物品不能重复放入,完全背包指每个物品可以无条件用,完全背包可以转化为01背包。下面分析01背包问题。有一个背包,容量为4磅,有如下物品:要求:1)装入背包的物品的总价值最大,并且重量不超出背包容量;2)装入物品不能重复。

2024-04-11 15:52:37 549

原创 常见算法——分治算法

有三根柱子A,B,C,A柱子上面有很多个大小不同的圆盘,大盘在下面,小盘在上面,要求将A盘上的所有圆盘摆在C盘上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

2024-04-11 09:50:43 356

原创 常见算法——二分查找算法(非递归方式)

二分查找的前提是数组序列有序,其时间复杂度很低,为O(log2n),2为底数,这里采用非递归的方式进行。

2024-04-10 22:53:30 158

原创 递归(Recursion)、回溯——阶乘问题、迷宫问题、八皇后问题

后面补充~今天累啦 加油加油 大家!

2024-04-10 22:29:04 118

原创 数据结构——稀疏数组、队列、链表、栈、哈希表、树(包括堆)、图

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:1) 记录数组一共有几行几列,有多少个不同的值2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模1) 队列是一个有序列表,可以用数组或是链表来实现。2) 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出链表分为带头节点的链表和不带头节点的链表。链表是有序的列表,但是它在内存中是存储如下:1) 链表是以节点的方式来存储,是链式存储。

2024-04-10 22:18:19 1564

原创 数据结构——图

图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历。

2024-04-10 20:39:51 652

原创 多路查找树——多叉树、B树、B+树、B*树

2-3树是最简单的B树,特点如下:1) 2-3 树的所有叶子节点都在同一层.(只要是 B 树都满足这个条件)2) 有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点.3) 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点.4) 2-3 树是由二节点和三节点构成的树。

2024-04-10 16:06:26 663

原创 数据结构——树结构的应用(堆、赫夫曼树、赫夫曼编码、二叉排序树、平衡二叉树)

1)给定n个叶子节点,其有n个权值,构造一颗二叉树,树的带权路径长度(wpl)达到最小,称为最优二叉树,也叫赫夫曼树、哈夫曼树。2)赫夫曼树是wpl最短的树,其权值较大的节点离根较近。赫夫曼编码也叫哈夫曼编码(Huffman Coding)、霍夫曼编码,广泛用于数据文件压缩,赫夫曼 码是可变字长编码(VLC)的一种,称为最佳编码。BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。

2024-04-10 14:01:47 1222

原创 数据结构——树(二叉树、顺序存储树、线索化二叉树)

对数列{1,3,6,8,10,14}构建一颗二叉树如下,可以看到,中序遍历二叉树结果为{8,3,10,1,14,6},但是节点6,8,10,14的左指针、右指针没有完全利用上,若希望充分利用,则需要使用线索化二叉树。线索化二叉树的特点如下:1) n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")

2024-04-08 12:24:31 906

原创 数据结构——哈希表

(3)创建哈希表HashTab,其是一个数组,存放多个EmpLinkedList信息,需要初始化确定数组的容量,如存放7条链表,按照容量构造一个数组即可,为了利用id号查找雇员信息,需要编写一个方法,即编写:散列函数,表示id与表中位置的映射关系。(2)创建链表类EmpLinkedList,每个链表里有多个节点,可以存放多个雇员信息,创建Emp类的头指针,用来存放第一个雇员,后续编写添加雇员、查找雇员信息、以及遍历雇员信息的方法,利用一个辅助指针进行遍历、查找、添加即可,直到操作到链表的最后。

2024-04-06 21:58:16 359

原创 查找算法——斐波那契查找算法(黄金分割法)

(1)由于斐波那契数列F[k] = F[k-1] + F[k-2],所以F[k]-1 = (F[k-1]-1) + (F[k-2]-1) + 1,所以,只要顺序表的长度为F[k]-1,就可以将该表分成长度为F[k-1]-1)和F[k-2]-1的两端,因此中间位置就为mid=low+F(k-1)-1。斐波那契数列如:{1,1,2,3,5,8,13,21,34,55},其从第三个数开始,后一个数是前2个数的和,并且斐波那契数列两个相邻的数,前一个数与后一个数的比值无限接近黄金分割值0.618.

2024-04-06 15:01:08 427

原创 查找算法——插值查找算法

插值查找的思想:对一组有序数组,其不再是二分查找的折半方式查找,而是将二分查找里的初始下标mid进行优化,每次自适应的确定mid,从自适应mid索引处开始查找。确定了mid索引值后,以mid为基准进行查找,按照二分法的思路,分别向左、向右递归,直到找到待查找的值。可以看到,在查找有序序列{1,2,3,4,...100}时,仅需要一次查找,就能得到待查数字的索引值。再次强调:插值查找算法需要数组序列有序,且必须对待查找的数进行范围判断,避免越界。插值算法适用于数据量较大、且有序、均匀分布的实例。

2024-04-06 11:46:36 390

原创 查找算法——二分查找算法(递归方式)

二分查找的基本思路:首先确定数组序列的中间下标,然后让待查找的数与中间元素进行比较,若待查找的数大于中间值,说明其在中间值的右边,因此递归的向右进行查找,若待查找的数小于中间值,说明其在中间值的左边,因此递归的向左进行查找,若待查找的值恰好等于中间值,则说明就找到了。基本思想:此处我们采用递归的方式进行二分查找。2.递归完整个数组,也没有找到,说明不存在,需要返回,条件:left>right,即左索引大于右索引。改进,考虑一个数组里有多个相同的值,可以利用集合对所有符合的索引值进行保存,返回对应集合即可。

2024-04-03 22:21:12 360

原创 查找算法——顺序查找(线性查找)

查找算法里最简单的算法就是顺序查找,其也叫线性查找。顺序查找算法对序列是否有序没有要求,其思路比较简单:按顺序遍历一组元素,若找到了,返回其索引下标值即可。若要查找多个相同的元素,创建一个集合或者数组,每次遍历将索引值存入即可。

2024-04-03 21:25:21 204

原创 数据结构与算法——各个排序算法的比较

在进行复杂度分析时,常忽略常数项、低次项、以及系数,因为这些因素随着数据规模的增加,其影响较小。在一个算法中,时间频度与数据规模n有关,是n的函数,而当n趋于无穷大时的渐进时间频度的函数,可以理解为时间复杂度函数,简称。衡量一个算法的好坏的一个重要指标是时间复杂度,此处对时间复杂度进行简述。1.平均时间复杂度,是所有可能的输入实例均以等概率出现的情况下,算法的运行时间。8)指数阶 O(2^n),其复杂度特别高,应尽量避免使用此类复杂度的算法。),其复杂度特别高,应尽量避免使用此类复杂度的算法。

2024-04-03 21:08:28 189

原创 数据结构与算法——堆排序

堆排序与二叉树相关。

2024-04-03 20:47:22 124

原创 数据结构与算法——基数排序(改进的桶排序)

由于上述元素中最大数748为三位数,因此总共需要3轮排序,需要10个桶,桶下标分别为0,1,2,...9,恰好对应每位的数字0~9,首先将数字放入个位数字对应相同的桶下标的桶中,再按顺序取出桶中的元素,放入原始序列,再对第1轮处理后的arr数组,对其十位数进行相同操作,将数字放入十位数字对应相同的桶下标的桶中,再按顺序取出桶中的元素,放入原始序列,再对第2轮处理后的arr数组,对其百位数进行相同操作,最终就可以得到顺序排列的数组。在桶排序之前,将待排序的元素置为统一的长度,位数较少的数字在前面补零。

2024-04-03 20:43:58 128

原创 数据结构与算法——归并排序算法

通过上图分析,可以总结出治的详细思路:将左右两部分有序的数据进行排序,首先对左边第一个数据和右边第一个数据进行比较,将较小的数放入中转数组中,然后依次后移,进行比较,将较小的数继续放入中转数组中;根据上图给出分治算法的整体思路:在分的阶段,就是单纯的将数据分组,每次分的过程中,将数据分为两组,直到最后分成一个数据一组为止。治的过程中,首先将两个两个一组的数据进行有序合并,合并完成后,再将两组 两个有序数据 继续进行合并,接着继续将合并后的每组数据进行有序合并,直到将所有数据合并为一组,就可以完成有序排序。

2024-04-03 17:11:38 587

原创 数据结构与算法——快速排序法

快速排序算法

2024-04-03 14:41:11 503

原创 数据结构与算法——希尔排序法(直接插入排序的优化)

基本代码思路:在每一轮排序中,将步长设置上次步长的1/2,第一次步长为序列长度的1/2,以步长gap为步进,对arr[i]与arr[i+gap]两个元素进行比较,若发现逆序,则将数据进行交换,经过一轮排序后,数组趋向于有序状态,重复上述过程,当步长为1时,整个序列就处于有序状态。基本思想:把记录按下标的增量分组,对每组使用直接插入排序算法进行排序,随着增量减少,每组的记录越来越少,当增量减至1时,完成排序。针对这种排序方式,有两种方法,第一种是交换法,其效率较低,第二种是移动法,其效率较高。

2024-04-03 11:55:43 273

原创 数据结构与算法——直接插入排序

第一次排序时,有序表只有1个元素,即第一个元素,无序表有n-1个元素,在排序时,每次从无序表中取出第一个元素,将其依次与有序表中的元素进行比较,并按顺序插入到适当位置,当无序表里的数据都有序插入到有序表中时,可以最终得到一个有序表。通过上述代码分析可以知道:4个元素需要进行3轮插入排序,每轮的插入思路都一样,即:假定当前元素中,后一个元素为要插入的值,将其与前面所有元素进行比较,循环遍历前面每个元素,若其小于前面的元素,则将前面元素后移赋值,循环结束后,即找到插入位置,将待插入的值赋给索引号处即可。

2024-04-02 22:45:29 168

原创 数据结构与算法——选择排序算法

在第一轮中,假设索引为0的元素为最小值,然后通过循环和其后3个元素进行比较,若找到最小值,则重置最小值的索引号和对应的元素值,循环判断结束后,得到正确的最小值索引,将arr[0]的值赋给arr[最小值的索引],将最小值赋给arr[0],从而达到arr[0]元素与最小值元素位置交换的目的;第二轮中,同理,假设索引号1元素为最小值,通过循环和其后2个元素进行比较,在循环比较结束后,得到重置的最小索引号和元素值,再进行arr[1]与arr[最小值索引号]进行交换的操作,第三轮过程同理。

2024-04-02 21:34:08 341

原创 数据结构与算法——冒泡排序算法及优化

冒泡排序算法的基本思想和代码,以及其优化方法。

2024-04-02 17:05:12 239

原创 路漫漫其修远兮~

学了一段时间Java啦,着手记录一下,希望能巩固和反思一下~开启Java之旅~ 以后坚持打卡~

2023-12-05 22:22:54 338

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除