自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 sql报错 Illegal mix of collations

添加 COLLATE utf8mb4_unicode_ci。

2023-06-09 10:19:36 110

原创 数据结构与算法——平衡二叉树

基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。左旋转 //左旋转方法 private void leftRotate() { //用当前根结点的值创建新的结点 Node

2021-08-19 17:38:47 150

原创 数据结构与算法——二叉排序树

基本介绍二叉排序树:BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点。创建和遍历一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如: 数组为 Array(7, 3, 10, 12, 5, 1, 9) , 创建成对应的二叉排序树为:结点删除二叉排序树的删除情况比较复杂,有下面三种情况需要考虑删除叶子节点

2021-08-17 22:05:51 199

原创 数据结构与算法——赫夫曼树

基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L层结点的路径长度为 L-1。结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的

2021-08-10 21:41:47 181

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

基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏、最好、平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆...

2021-08-10 15:31:31 140

原创 数据结构与算法——线索化二叉树

线索化二叉树n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。一个结点的前一个结点,称为前驱结点。一个结点的后一个结点,称为后继结点。说明: 当线索化二叉树后

2021-08-04 22:38:56 169

原创 数据结构与算法——顺序存储二叉树

基本介绍从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2第 n 个元素的父节点为 (n-1) / 2n : 表示二叉树中的第几个元素(按 0 开始)代码实现public class ArrBinaryTreeDemo { public static void main(String[]

2021-08-04 15:28:26 143

原创 数据结构与算法——二叉树

基本介绍存储方式数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低。链表存储方式分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)。树存储方式分析能提高数据存储,读取的效率, 比如利用二叉排序树(Binary Sort Tr

2021-08-01 20:51:11 69

原创 数据结构与算法——哈希表

基本介绍散列表(Hash table),也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。实例有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址等),当输入该员工的 id 时,要求查找到该员工的所有信息。代码实现public class HashTabDemo { public static void mai

2021-07-30 21:13:14 79

原创 数据结构与算法——斐波那契查找

基本介绍斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或插值得到,而是位于黄金分割点附近,即 mid=low+F[k-1]-1(F 代表斐波那契数列),如下图所示但顺序表长度 n 不一定刚好等于 F[k]-1,所以需要将原来的顺序表长度 n 增加至 F[k]-1。这里的 k 值只要能使得 F[k]-1 恰好大于或等于 n 即可。while(n > f[k] - 1) k++;顺序表长度增加后,新增的位置(从 n+1 到 f[k]-1 位置)都赋为 n

2021-07-29 22:02:32 108

原创 数据结构与算法——插值查找

基本介绍插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。在数据分布均匀时效率高(联想斜率恒定)即 int mid = left + (right – left) * (findVal – arr[left]) / (arr[right])代码实现 /** * 插值查找,要求数组有序 * * @param arr 数组 * @param left 左索引 * @param right 右索引 * @

2021-07-29 21:52:11 87

原创 数据结构与算法——二分查找

基本介绍代码实现 /** * 二分查找要求数组有序 * @param arr 数组 * @param left 左索引 * @param right 右索引 * @param value 查找的数据 * @return 包含数据索引的集合 */ public static ArrayList<Integer> binarySearch(int[] arr, int left, int right, int

2021-07-28 22:44:13 76

原创 数据结构与算法——线性查找

基本介绍有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。代码实现 public static int seqSearch(int[] arr, int value) { //线性查找是逐一比对,发现有相同值就返回下标(找到一个就返回) for (int i = 0; i < arr.length; i++) { if (arr[i

2021-07-28 22:40:28 54

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

基本介绍基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。演示图解将所有待比较数值统

2021-07-28 14:58:59 82

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

基本介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。演示图解整体思路合并思路代码实现public class MergeSort { public static void main(String[] args) { int[] arr =

2021-07-27 18:31:46 75

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

基本介绍希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法终止。演示图解代码实现移位法//希尔排序(移位法) public static void shellSort2(int[] arr) {

2021-07-23 13:21:19 81

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

基本介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。演示图解代码实现 //插入排序 public static void i

2021-07-22 21:13:42 83

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

基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。演示图解代码实现 //选择排序,时间复杂度O(n^2) public static void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int minIndex = i; //初始最小值所在索引 in

2021-07-22 17:28:18 59

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

基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。演示图解一共进行数组的大小-1次大的循环每一趟排序的次数在逐渐的减少如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。代码实现 //冒泡排序封装为一个方法,时间复杂度O(n^2) public static void bubbleSort(int[] arr) {

2021-07-22 13:49:21 92

原创 数据结构与算法——排序算法和时间复杂度

排序算法分类时间复杂度一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,O(f(n))为算法的时间复杂度。常见的算法复杂度:常数阶O(1)对数阶O(log2n)线性阶O(n)线性对数阶O(nlog2n)平方阶O(n2)立方阶O(n3)k次方阶O(nk)指数阶O(2n)常见的时间复杂度对应图常见算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n)随着问题规模 n 的不

2021-07-22 13:43:16 602

原创 数据结构与算法——递归

递归概念递归就是方法自己调用自己,每次调用传入不同的变量,有助于解决复杂的问题,让代码更加简洁。例:打印 public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n); } //结果为n=2 n=3 n=4 ...阶乘 public static int factorial(

2021-07-21 17:27:37 63

原创 数据结构与算法——栈实现计算器

中缀表达式计算器public class Calculator { @Test public void testCalculator() { String expression = "30+2*6-2"; //创建两个栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack = new ArrayStack2(10); //

2021-07-20 12:01:15 231

原创 数据结构与算法——栈

定义栈(stack)是一个先入后出的有序列表。栈是限制线性表中元素的插入和删除只能在线性表的同一段进行的一种特殊线性表。允许插入和删除的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素相反,最后放入的元素最先删除,最先放入的元素最后删除。应用场景:子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。处理递归调用:和子程序的调用类似,只

2021-07-14 20:39:32 65

原创 数据结构与算法——约瑟夫问题(环状链表)

描述方法用一个不带头节点的循环链表处理Josephu问题:先构成一个有n个节点的单循环链表,然后由k节点起从1开始计数,计到m时,对应节点从链表中删除,然后再从被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除,算法结束创建环形链表添加节点先创建一个节点,让first指向该节点,并形成环形后面没创建一个新节点,就把该节点加入到已有的环形链表中即可 //创建first节点,当前没有编号 private JosephuNode first = null;

2021-07-14 14:43:08 196

原创 数据结构与算法——双向链表

双向链表示意图遍历链表 //初始化头节点 private ListNode head = new ListNode(0); //返回头节点 public ListNode getHead() { return head; } //显示链表(遍历) public void list() { //判断链表是否为空 if

2021-07-13 22:08:05 41

原创 数据结构与算法——单链表习题

获取单链表节点个数 /** * 获取单链表节点个数(不统计头节点) * * @param head 链表的头节点 * @return 返回有效节点个数 */ public static int getLength(ListNode head) { if (head.next == null) { return 0; } int length = 0;

2021-07-13 16:09:46 223

原创 数据结构与算法——单链表

数据结构——单链表单链表介绍显示链表添加节点不考虑编号顺序考虑编号顺序修改节点删除节点测试代码定义节点单链表介绍显示链表//先初始化一个头节点,头节点不动 private HeroNode head = new HeroNode(0, "", ""); //显示链表(遍历) public void list() { //判断链表是否为空 if (head.next == null) { System.out.pri

2021-07-10 17:24:39 57

空空如也

空空如也

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

TA关注的人

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