- 博客(24)
- 收藏
- 关注
原创 最小生成树和普利姆算法及克鲁斯卡尔算法
一、最小生成树的介绍最小生成树(Minimum Cost Spanning Tree), 简称 MST。即给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树N个顶点,一定有N-1条边包含全部顶点求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法二、普利姆算法普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所
2021-04-11 16:59:38 858
原创 贪心算法和集合覆盖问题
一、贪心算法的概述贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果...
2021-04-09 20:29:37 440
原创 暴力匹配算法和KMP算法
一、暴力匹配算法1.1 基本步骤如果当前字符匹配成功(即str1[i] == str2[j]),则i++,j++,继续匹配下一个字符如果失配(即str1[i]! = str2[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。1.2 代码实现package kmp;public class violenceMatch { public static void main(String[] args) { String
2021-04-09 16:28:19 305
原创 动态规划算法解决背包问题
一、动态规划算法1.1 基本介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )动态规划可以通过填表的方式来逐步推进,得到最优解.
2021-04-06 21:11:40 1968 1
原创 分治算法解决汉诺塔问题
分治算法一、分治算法的介绍二、分治算法的基本步骤三、汉诺塔问题一、分治算法的介绍字面上的解释是“分而治之”,分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换),二分查找,大整数乘法,棋盘覆盖 ,线性时间选择,最接近点对问题,循环赛日程表,汉诺塔二、分治算法的基本步骤分解:将原问题分解为若干个规模较小,相互独立,与
2021-04-04 20:42:55 566
原创 图
图一、图的基本介绍1.1 什么是图1.2 图的常用概念1.3 图的表示方式二、图的创建三、图的遍历3.1 深度优先遍历(Depth First Search)3.2 广度优先遍历一、图的基本介绍当需要多对多的关系时,就会用到图1.1 什么是图图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。1.2 图的常用概念顶点(vertex) :就是结点边(edge) :两个节点之间的连接路径:从一个节点到另一个节点的路线无向图:顶点之间的连接
2021-04-03 21:37:42 98
原创 平衡二叉树(AVL树)
平衡二叉树一、平衡二叉树的基本介绍二、平衡二叉树的应用案例2.1 左旋转2.2 右旋转2.3 双旋转一、平衡二叉树的基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。下面两案例都是属于平衡二叉树:二、平衡二叉树的应用
2021-04-01 13:37:28 155
原创 二叉排序树(BST)
二叉排序树一、二叉排序树的介绍二、二叉排序树创建和遍历一、二叉排序树的介绍BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。下图就是一颗二叉排序树:如果有相同的值,将该节点放在左子节点或右子节点都可以二、二叉排序树创建和遍历数组Array(7, 3, 10, 12, 5, 1, 9) 创建成对应的二叉排序树,并使用中序遍历二叉排序树代码实现:package binaryS
2021-03-30 21:40:06 571
原创 队列
队列一、队列的基本介绍二、数组实现队列的基本思路一、队列的基本介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变图示:使用数组模
2021-03-27 21:32:27 83
原创 哈夫曼树
哈夫曼树一、哈夫曼树的基本介绍1.1 什么是哈夫曼树1.2 哈夫曼树的重要概念1.3 哈夫曼树的创建思路二、哈夫曼树的代码实现一、哈夫曼树的基本介绍1.1 什么是哈夫曼树给定 n 个权值作为 n 个叶子节点,构造一棵二叉树,若该树的带权路径长度(Weighted Path Length of Tree)达到最小, 称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。1.2 哈夫曼树的重要概念路径和路径长度:在一棵树
2021-03-25 19:30:52 26156
原创 堆排序
堆排序一、堆排序的基本介绍二、堆排序的基本思想一、堆排序的基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右子结点的值,称为大顶堆, 注意 : 没有要求结点的左子节点的值和右子节点的值的大小关系。大顶堆特点:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]每个结点的
2021-03-25 15:10:35 84
原创 简单二叉树
二叉树(一)一、二叉树的概述1.1 为什么需要树这样的数据结构1.2 什么是二叉树1.3 二叉树遍历的概述二、二叉树的基本操作2.1 二叉树的遍历2.2 二叉树的查找2.3 二叉树删除节点一、二叉树的概述1.1 为什么需要树这样的数据结构在前面已经学习了数组和链表这两种数据结构,这两种数据结构都有着鲜明的特点数组存储方式的分析:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低链式存储方式
2021-03-23 13:33:50 283
原创 顺序存储二叉树和线索化二叉树
二叉树(二)一、顺序存储二叉树1.1 顺序存储二叉树的概述1.2 顺序存储的代码实现二、线索化二叉树2.1 线索化二叉树的概述2.2线索化二叉树的代码实现2.3 遍历线索化二叉树一、顺序存储二叉树1.1 顺序存储二叉树的概述从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序结构存储就是使用数组来储存,一般使用数组只适合表示完全二叉树,因为不完全二叉树会有空间的浪费。顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为
2021-03-23 13:32:54 243
原创 哈希表
哈希表一、哈希表的概述1.1 什么是哈希表1.2 哈希表的工作原理二、哈希表实现的基本思路一、哈希表的概述1.1 什么是哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。1.2 哈希表的工作原理在一般的产品中位于java程序和数据库之间有一层缓存层,现在的缓存产品一般有redis或者memcache,而哈希表
2021-03-17 17:56:23 101
原创 查找算法
排序一、线性查找2.1 什么是线性查找2.2 线性查找的代码实现二、二分查找2.1 什么是二分查找2.2 二分查找的步骤2.3 二分查找的代码实现三、插值查找3.1 什么是插值查找3.2 插值查找的步骤3.3 插值查找的代码实现3.4 注意事项四、斐波那契(黄金分割)查找一、线性查找2.1 什么是线性查找顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。2.2 线性查找的代码实现public class SeqSearch { public static void mai
2021-03-17 15:51:27 144
原创 排序算法
排序算法一、冒泡排序1.1 冒泡排序的概述1.2 冒泡排序的基本步骤2.3 冒泡排序的代码实现2.4 冒泡排序的优化一、冒泡排序1.1 冒泡排序的概述冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下 来没有进行过交换,就说明序列有序,因此要在排序过程中设置 一个标志flag
2021-03-13 22:05:31 754 1
原创 递归
递归一、递归的概述1.1 什么是递归1.2 递归的调用机制1.2.1 递归调用需要遵守的规则1.2.2 构成递归需要构成的条件1.2.3 递归的运行机制1.3 递归能解决什么问题二、应用(一):迷宫问题三、应用(二):八皇后问题一、递归的概述1.1 什么是递归递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。1.2 递归的调用机制1.2.1 递归调用需要遵守的规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方法的局部
2021-03-03 11:59:49 278
原创 前缀、中缀、后缀表达式(逆波兰表达式)的实现
文章目录一、前缀表达式(波兰表达式)1.1 前缀表达式的定义二、中缀表达式(波兰表达式)三、后缀表达式(波兰表达式)三级目一、前缀表达式(波兰表达式)1.1 前缀表达式的定义前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前二、中缀表达式(波兰表达式)三、后缀表达式(波兰表达式)三级目...
2021-03-01 21:45:23 972 1
原创 栈
栈一、栈的概述1.1 什么是栈1.2 出栈(pop)和入栈(push)的理解1.3 栈的应用1.3.1 子程序的调用:1.3.2 处理递归调用:1.3.3 表达式的转换:1.3.4 二叉树的遍历1.3.5 图形的深度优先(depth一first)搜索法二、数组模拟栈三、栈实现综合计算器一、栈的概述1.1 什么是栈栈的英文为(stack) ,栈是一个先入后出(FILO-First In Last Out)的有序列表。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性
2021-02-27 17:06:35 583
原创 单项环形链表和约瑟夫问题(丢手帕问题)
单项环形链表和约瑟夫问题一、应用环境二、添加节点的实现三、约瑟夫问题的实现一、应用环境约瑟夫( Josephu ) 问题是一个非常著名的有趣的题目。问题具体描述如下:设编号分别为1、2、3… n 的 n 个人围坐一圈,约定编号为 k(1≤k≤n)的人从 1 开始报数,数到 m 的那个人出列。出列的人的下一位又从 1 开始报数,数到 m 的那个人继续出列。以此类推,直到所有人都出列为止,由此产生一个出队编号的序列,这个序列也就是约瑟夫问题的解。二、添加节点的实现思路:先创建第一个节点,让fir
2021-02-25 19:00:35 129 1
原创 双向链表
双向链表一、双向链表的概述1.1 什么是双向链表1.2 双向链表和单向链表的区别二、双向链表的应用2.1 添加节点2.2 修改节点2.3 删除节点一、双向链表的概述1.1 什么是双向链表双向就是链表由单向的链变成了双向链。 使用这种数据结构,我们可以不再拘束于单链表的单向创建于遍历等操作,大大减少了在使用中存在的问题。1.2 双向链表和单向链表的区别单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除双向链
2021-02-24 19:12:55 1096
原创 单链表及算法题
文章目录一、单链表的概述1.1 单链表的存储方式二、单链表的基本操作2.1 添加节点2.2 按顺序插入结点2.3 修改节点三、单链表常见算法题一、单链表的概述1.1 单链表的存储方式链表是有序的列表,但是它在内存中是存储如下:其中,data 域存放的是本结点的数据,next 域存放的是下一个结点的地址二、单链表的基本操作实现链表最重要的就是增、删、改、查假设我现在有个需求,要求使用链表实现一个水浒英雄榜管理系统。这个系统的具体功能如下:1.可以增加水浒英雄(直接在链表末尾追加)2.可
2021-02-24 18:29:51 159
原创 稀疏数组
文章目录@[TOC](文章目录)一、稀疏数组的概述1.1 什么是稀疏数组1.2 具体实例1.2.1 应用场景1.3 实现思路1.3.1 二维数组转稀疏数组1.3.2 稀疏数组转二维数组二、代码实现一、稀疏数组的概述1.1 什么是稀疏数组稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组,当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。1.2 具体实例1.2.1 应用场景1.使用稀疏数组,来保留类似前面的二维数组(棋盘、地图
2021-02-23 17:13:29 166
原创 JAVA学习:反射机制
一、关于反射的理解1.1反射的概述Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。框架 = 反射 + 注解 + 设计模式。1.2反射机制提供的功能我的学习也主要围绕这几大java反射机制的强大功能1.3 相关的api和常用的方法方法名功能说明static Class forName(String name)返回指定类名 name 的 Class 对象
2021-02-19 15:25:25 163
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人