数据结构与算法
文章平均质量分 68
笔记
玳宸
这个作者很懒,什么都没留下…
展开
-
KMP 算法
文章目录KMP 算法介绍KMP 算法最佳应用-字符串匹配问题思路分析图解代码实现KMP 算法介绍Knuth-Morris-Pratt 字符串查找算法,简称为“KMP算法”,常用于在一个文本串 S 内查找一个模式串 Р 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H.Morris 三人于1977年联合发表,故取这3人的姓氏命名此算法。KMP 方法算法就利用之前判断过信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 nex原创 2021-05-28 20:46:11 · 99 阅读 · 0 评论 -
【树结构】实际应用 —— 堆排序、哈夫曼树、二叉排序树、平衡二叉树(AVL树)
文章目录一、堆排序二、赫夫曼树三、赫夫曼编码四、二叉排序树五、平衡二叉树(AVL树)一、堆排序二、赫夫曼树三、赫夫曼编码四、二叉排序树五、平衡二叉树(AVL树)原创 2021-05-18 21:06:35 · 524 阅读 · 0 评论 -
【树结构】基础部分 —— 二叉树、顺序存储二叉树、线索化二叉树
文章目录一、二叉树1、二叉树的概念2、二叉树的遍历(应用实例)3、二叉树查找指定节点4、二叉树删除节点二、顺序存储二叉树三、线索化二叉树一、二叉树1、二叉树的概念树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。二叉树的子节点分为左节点和右节点示意图如果该二叉树的所有叶子节点都在最后一层,并且结点总数=2^n-1 , n 为层数,则我们称为满二叉树。如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称原创 2021-05-16 12:34:24 · 142 阅读 · 0 评论 -
哈希表
文章目录1、基本介绍2、上机题1、基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2、上机题有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…, 当输入该员工的 id 时,要求查找到该员工的所有信息。要求:不使用数据库,速度越快越好 -> 哈希表(散列)原创 2021-05-15 11:20:11 · 77 阅读 · 0 评论 -
查找算法(线性查找、二分查找、插值查找、斐波那契查找)
文章目录1、线性查找2、二分查找3、插值查找4、斐波那契查找1、线性查找有序数组、无序数组都可使用。实例: 查找数组 { 1, 9, 11, -1, 34, 89 } 里是否存在 -11。public class SeqSearch { public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 };// 没有顺序的数组 int index = seqSearch(arr, -11); i原创 2021-05-14 15:08:17 · 255 阅读 · 0 评论 -
排序算法(冒泡、选择、插入、希尔、快速、归并、基数)
文章目录一、冒泡排序二、选择排序三、插入排序四、希尔排序五、快速排序六、归并排序七、基数排序一、冒泡排序冒泡排序(气泡分类)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志标志判断元素是否进行过交换。从而减少不必要的比较。图解例子:小结上面的图解过程原创 2021-05-13 20:06:09 · 208 阅读 · 0 评论 -
【递归】八皇后问题
文章目录问题介绍算法思路分析算法代码实现问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。算法思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否可行,如果不行,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第 8原创 2021-05-06 17:26:11 · 66 阅读 · 0 评论 -
【递归】迷宫问题
问题描述: 小球需要从 A 点走到 B 点,红色方块为墙不能走。使用递归回溯解决问题: //使用递归回溯来给小球找路 //说明 //1. map 表示地图 //2. i,j 表示从地图的哪个位置开始出发 (1,1) //3. 如果小球能到 map[6][5] 位置,则说明通路找到. //4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通 //5. 在走迷宫时,需要确定一个策略(方法) 下->右原创 2021-05-06 16:58:53 · 91 阅读 · 0 评论 -
【递归】基础知识
递归的概念:简单的说,递归就是方法自己调用自己,每次调用时传入不同的变量。递归的应用场景:各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等将用栈解决的问题 -> 递归代码比较简洁递归遵循的规则:执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响,比如n变量如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。递归必须向退出递归的条件原创 2021-05-05 22:06:46 · 202 阅读 · 0 评论 -
【栈】实现中缀表达式与逆波兰表达式
看这篇文章前最好对栈有基本的了解,可以先看看文章 https://blog.csdn.net/zeroheitao/article/details/116402748,本篇的代码是在这篇文章的基础上扩展的。文章目录1、栈实现综合计算器(中缀表达式)2、前缀、中缀、后缀表达式(逆波兰表达式)2.1、前缀表达式2.2、中缀表达式2.3、后缀表达式3、逆波兰计算器4、中缀表达式转换为后缀表达式5、逆波兰计算器完整版1、栈实现综合计算器(中缀表达式)使用栈实现计算器计算类似 7 * 2 - 5 + 2 *.原创 2021-05-04 19:31:17 · 207 阅读 · 0 评论 -
栈
文章目录1、栈的介绍2、栈的应用场景3、栈的快速入门1、栈的介绍栈的英文为(stack)栈是一个先入后出(FIFO-First In Last Out)的有序列表栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除图解方式说明出栈原创 2021-05-04 17:44:37 · 119 阅读 · 0 评论 -
【链表 Linked List】单向环形链表_约瑟夫问题
Josephu(约瑟夫、约瑟夫环)问题 Josephu 问题为:设编号为1,2,… n 的 n 个人围坐一圈,约定编号为k (1<=k<=n) 的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示:用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点原创 2021-05-02 14:59:45 · 102 阅读 · 0 评论 -
【链表 Linked List】双向链表
使用带 head 头的双向链表实现文章目录单向链表与双向链表对比:双向链表的遍历,添加,修改与删除:1、遍历2、添加3、修改4、删除单向链表与双向链表对比:单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点,而双向链表则可以自我删除。双向链表的遍历,添加,修改与删除:1、遍历 // 遍历双向链表的方法 // 显示链表[遍历] public void list() { // 判断链表是否为空 if (head.next =.原创 2021-05-02 13:50:41 · 77 阅读 · 1 评论 -
【链表 Linked List】单向链表
单链表的应用实例:完成对水浒人物的增删改查操作文章目录插入节点删除节点显示链表求单链表中有效节点的个数查找单链表中的倒数第k个结点单链表反转从尾到头打印单链表完整代码插入节点第一种方法在添加时,直接添加到链表的尾部,没有按照编号从大到小。第二种方法在添加时,根据编号从小到大插入到指定位置。 //添加节点到单向链表 //思路,当不考虑编号顺序时 //1. 找到当前链表的最后节点 //2. 将最后这个节点的next 指向 新的节点 public void add(HeroNode he.原创 2021-04-30 21:17:39 · 93 阅读 · 1 评论 -
稀疏 sparsearray 数组
文章目录实例基本介绍应用分析及实现实例编写的五子棋程序中,有存盘退出和续上盘的功能。分析:记录了很多没有意义的数据基本介绍当一个数组中大部分元素为 0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模应用分析及实现使用稀疏数组,来保存类似前面的二维数组(棋盘、地图等)把稀疏数组存盘,并且可以从新恢复原来的二维数组数整体思路代码实现原创 2021-04-30 11:54:56 · 173 阅读 · 0 评论 -
算法_动态规划
目录1 最大子段和2 0-1背包3 回文串问题4 矩阵链相乘问题5 寻宝1 最大子段和给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。要求算法的时间复杂度为O(n)。输入格式:输入有两行:第一行是n值(1<=n<=10000);第二行是n个整数。输出格式:输出最大子段和。输入样例:在这里给出一组输入。例如:6-2 11 -4 13 -5原创 2020-12-22 20:55:00 · 131 阅读 · 0 评论 -
算法_回溯
目录1 最佳调度问题2 八皇后问题3 0-1背包4 整数拆分5 6666 工作分配问题1 最佳调度问题假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。输入格式:输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。输出格式:将计算出的完成全部任务的最早时间输出原创 2020-12-22 20:49:07 · 235 阅读 · 0 评论 -
算法_贪心算法
目录1 装箱问题2 月饼3 最优合并问题4 看电影5 喷水装置6 活动选择问题1 装箱问题输入样例:860 70 80 90 30 40 10 20输出样例:60 170 280 390 430 140 510 120 25#include<iostream>using namespace std;int main(){ int N,i,j; cin >> N; int a[N],b[N]={0},c[N]={0};原创 2020-12-22 20:42:18 · 184 阅读 · 0 评论 -
算法_递归
目录1 递归实现逆序输出整数 (20分)2 二分查找 (20分)3 改写二分搜索算法 (20分)4 分形的递归输出 (20分)5 棋盘覆盖 (20分)6 循环日程表 (20分)1 递归实现逆序输出整数 (20分)本题目要求读入1个正整数n,然后编写递归函数reverse(int n)实现将该正整数逆序输出。输入格式:输入在一行中给出1个正整数n。输出格式:对每一组输入,在一行中输出n的逆序数。输入样例:12345输出样例:54321#include<iostream>原创 2020-12-22 20:34:51 · 467 阅读 · 0 评论 -
算法_枚举
目录1 穷举问题-搬砖2 百鸡问题扩展-N鸡问题3 输出全排列4 梅森数5 换硬币1 穷举问题-搬砖某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?输入格式:输入在一行中给出一个正整数n。输出格式:输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c"的格式,输出男人的数量cnt_m,女人的数量cnt_w,小孩的数量cnt_c。请注意,等号的两侧各有一个空格,逗号的后面原创 2020-12-22 20:26:34 · 135 阅读 · 0 评论 -
算法_绪论
目录1 办事大厅排队2 利用STL比较数据大小并排序3 跳一跳4 排序5 求前缀表达式的值1 办事大厅排队在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。请同学们学习C++ STL中 list相关内容后,编程实践。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1) in name 表示名字为name的人员新来到办事大厅,排在队伍的最后。(in和name间存在一个空格,name是名字原创 2020-12-22 20:13:11 · 98 阅读 · 0 评论 -
喷水装置_贪心算法
长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?输入格式:输入包含若干组测试数据。第一行一个整数T表示数据组数。每组数据的第一行是整数n、L和W的值,其中n≤10 000。接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径。如图1所示的示意图是样例输入的第一组数据所描述的情况。输出格式:对每组测试数据输出一个数原创 2020-12-01 13:23:17 · 948 阅读 · 0 评论 -
棋盘覆盖
题目描述: 在一个2^k * 2k(k为正整数,k<=10,length=2k)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格(其坐标为aa,bb,分别代表行坐标号和列坐标号),以及有四种L型骨牌(如下图)。求用若干块这种L型骨牌实现除该特殊点棋盘的全覆盖。(本题要求采用分治算法做)输入格式:输入三个数,分别是aa,bb,length.输出格式:输出整个棋盘。其中特殊方格填为0,然后铺棋盘的顺序为:先铺四个子棋盘交界的部分,然后递归的对每个子棋盘按照左上,右上,右下原创 2020-11-20 20:20:29 · 291 阅读 · 0 评论 -
748.最短补全数
题目描述:给定一个字符串牌照 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 。如果单词列表(words)中的一个单词包含牌照(licensePlate)中所有的字母,那么我们称之为 补全词 。在所有完整词中,最短的单词我们称之为 最短补全词 。单词在匹配牌照中的字母时要:忽略牌照中的数字和空格。不区分大小写,比如牌照中的 “P” 依然可以匹配单词中的 “p” 字母。如果某个字母在牌照中出现不止一次,那么该字母在补全词中的出现次数应当一致原创 2020-10-25 23:29:52 · 155 阅读 · 0 评论