数据结构与算法
莫逸雪
戒骄戒躁,面包会有的,牛奶也会有的。
展开
-
赫夫曼树笔记
基本介绍1.给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。2.赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。概念1.路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结...原创 2020-01-08 15:32:23 · 129 阅读 · 0 评论 -
线索化二叉树笔记
线索化二叉树介绍1.n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。2.这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序...原创 2020-01-07 13:23:20 · 138 阅读 · 0 评论 -
二叉树的顺序存储
说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序存储二叉树的特点1.顺序二叉树通常只考虑完全二叉树2.第n个元素的左子节点为 2 * n + 13.第n个元素的右子节点为 2 * n + 24.第n个元素的父节点为 (n-1) / 25.n : 表示二叉树中的第几个元素(按0开始编号,如图所示)图解代码实现 pub...原创 2020-01-06 15:35:02 · 489 阅读 · 0 评论 -
二叉树
二叉树概念1.树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2.二叉树的子节点分为左节点和右节点。3.如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。4.如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。二叉树的遍历前序遍历...原创 2020-01-06 11:05:11 · 101 阅读 · 0 评论 -
哈希表代码实现
基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。图解代码实现private static int maxSize=20; public static void main(String[] a...原创 2020-01-03 17:53:15 · 496 阅读 · 0 评论 -
二分查找
题目{1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000.代码public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] arr={1,8,10,89...原创 2019-12-30 23:37:58 · 146 阅读 · 0 评论 -
基数排序(桶排序)整理
基数排序介绍1.基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2.基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3.基数排序(Radix Sort)是桶排序的扩展4.基数排序是1887年...原创 2019-12-30 20:28:10 · 281 阅读 · 0 评论 -
归并排序整理
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。算法复杂度图解归并子序列图解代码public static void main(String[] ...原创 2019-12-30 16:40:34 · 227 阅读 · 0 评论 -
插入排序详解
基本介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之...原创 2019-12-28 23:51:18 · 305 阅读 · 0 评论 -
选择排序详解
基本介绍选择式排序属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。思想选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]arr[n-1]中选取最小值,与ar...原创 2019-12-28 22:39:42 · 1227 阅读 · 2 评论 -
冒泡排序优化版
优化:因为排序过程中,各元素不断接近自己的位置如果一趟比较下来没有进行交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。代码实现 int[] arr ={3,9,-1,10,20}; int t=0; //中间变量 boolean flag=false; //标志当前循环是不是一次也...原创 2019-12-28 15:55:34 · 110 阅读 · 0 评论 -
中缀表达式转换为后缀表达式
具体步骤:*举例:1+((3+2)4)-5=》1 3 2 + 4 * + 5 -代码:public static void main(String[] args){ Scanner scanner=new Scanner(System.in); String expression="1+((3+2)*4)-5";//=>1, 3,...原创 2019-12-26 20:29:28 · 173 阅读 · 0 评论 -
约瑟夫问题代码实现
问题:设编号1,2,·····n的n个人围成一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的人继续出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。主函数测试代码: public static void main(String[] args){ Scanner scanner=new ...原创 2019-12-25 12:36:09 · 492 阅读 · 0 评论 -
单链表顺序插入节点
主函数测试:public static void main(String[] args){ Scanner scanner=new Scanner(System.in); //先创建节点 HeroNode hero1=new HeroNode(1,"宋江","及时雨"); HeroNode hero2=new HeroNode(2...原创 2019-12-23 11:13:14 · 569 阅读 · 0 评论 -
数组模拟队列的实现
首先指明一下条件:1.rear表示队尾元素2.front表示队头元素3.初始rear和front均指向-1(隐含也指rear指向的是队头的前一个元素,rear指向的是当前队尾元素)4.队列为空条件:front=rear5.队列为满的条件:rear=maxsize(队列空间)-1考虑完这些条件就可以设计代码咯。主函数代码: public static void main(Strin...原创 2019-12-22 14:59:18 · 186 阅读 · 0 评论 -
二维数组与稀疏数组的相互转换
应用实例:棋盘,地图等。用法: public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int[][] nums1 = new int[11][11]; nums1[1][2]=1; nums1[2][3]=2; ...原创 2019-12-21 14:42:46 · 175 阅读 · 0 评论 -
最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”来源:力扣(LeetCode)再多举几个例子:示例一:输入:""输出:""示例二:输入:“ccc”输出:“ccc”示例三:输入:“a”输...原创 2019-12-20 20:01:30 · 91 阅读 · 0 评论 -
寻找两个有序数组的中位数
发现自己一年没写点东西了,感觉蛮可怕的,所以要求自己每天记录一下自己做的题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:num...原创 2019-12-19 19:17:17 · 88 阅读 · 0 评论 -
栈应用2(中缀表达式转换成后缀表达式)-笔记
问题:如何使用栈来实现将中缀转换为后缀表达式的算法?解答:在讨论算法前,首先介绍中缀、前缀和后缀表达式的定义中缀:中缀表达式由一个单一字符或运算符,连接前后两个中缀字符串共同组成。AA+B(A+B)+(C+D)前缀:前缀表达式由一个单一字符或运算符,随后是两个前缀字符串共同组成。每个前缀字符串长度大于1,包含一个运算符、第一个操作数和第二个操作数。A+AB++AB-CD后缀:后...原创 2018-12-27 16:53:48 · 871 阅读 · 0 评论 -
栈应用1(判定括号是否匹配)-笔记
问题:如何使用栈来判定括号是否匹配解答:对于给定的表达式,可以使用栈来实现括号匹配判定算法。这个算法在编译器中非常重要。解析器每次读入一个字符,如果字符是一个开分隔符(如(、{、或 [ ),那么将其入栈。若读入的是一个闭分隔符(如)、}、或 ] ),那么将栈顶的开分隔符出栈,并与闭分隔符比较。如果两者匹配,则继续解析字符串。如果不匹配,解析器显示匹配错误。下面给出一个时间复杂度为O(n)的基于栈...原创 2018-12-27 15:52:16 · 1052 阅读 · 0 评论 -
栈-笔记1
1.什么是栈?栈(stack)是一个有序线性表,只能在表的一端(称为栈顶,top)执行插入和删除操作。最后插入的元素将第一个被删除。所以,栈也称为后进先出(Last In First Out,LIFO)或先进先出(First In Last Out,FILO)线性表。两个改变栈操作都有专用名称。一个称为入栈(push),表示在栈中插入一个元素;另一个称为出栈(pop),表示从栈中删除一个元素。...原创 2018-12-26 22:12:47 · 219 阅读 · 0 评论