- 博客(47)
- 收藏
- 关注
原创 深度优先遍历和广度优先遍历
深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。所谓图的遍历,即是对结点的访问。类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点。邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…
2023-05-11 18:19:26
613
原创 平衡二叉树
平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。
2023-05-09 17:11:30
587
2
原创 二叉排序树
假如给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。使用数组数组未排序: 优点:直接在数组尾添加,速度快。缺点:查找速度慢.数组排序:优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。[示意图]使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。使用二叉排序树。
2023-05-07 19:50:07
575
原创 哈夫曼编码&文件压缩和解压
赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码。
2023-05-07 14:36:53
4647
原创 哈夫曼树的实现
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
2023-05-05 19:14:40
75
原创 单例模式的介绍
介绍:单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码块模式。例如: 代表JVM运行环境的Runtime类特点:1.是某个类只能有一个实例;构造器私有化2.是它必须自行创建这个实例;含有一个该类的静态变量来保存这个唯一的实例3.是它必须自行向整个系统提供这个实例;对外提供获取该实例对象的方式:直接暴露用静态变量的get方法获取。
2023-05-05 10:28:38
425
原创 堆排序算法
1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2.堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。3.每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。4.大顶堆举例说明5.小顶堆举例说明6.一般升序采用大顶堆,降序采用小顶堆。
2023-05-04 20:51:54
46
原创 顺序存储二叉树&线索化二叉树
背景:从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。特点:1.顺序二叉树通常只考虑完全二叉树2.第n个元素的左子节点为 2 * n + 13.第n个元素的右子节点为 2 * n + 24.第n个元素的父节点为 (n-1) / 25.n : 表示二叉树中的第几个元素(按0开始编号如图所示)概念:遍历二叉树是以一定规则将二叉树中的结点排列成一个线性序列,得到二叉树中结点的先序序列、中序序列或后序序列。
2023-05-04 17:07:30
126
原创 二叉树的实现
能提高数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也可以保证数据的插入,删除,修改的速度。4.如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。中序遍历:先遍历左子树,再输出父节点,再遍历右子树。二叉树有三种遍历方式。
2023-05-01 16:23:26
420
原创 哈希表的实现
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。相当于在一个数组中存放了很多链表的头结点,而每个链表都有自己的元素,这一结构就称之为HashTable,下面就是自己实现HashTable的类。
2023-05-01 16:09:05
34
原创 四大查找算法
介绍:插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式findVal-arr[left]/arr[right]-arr[left]。其查找的基本过程为:利用循环顺序扫描整个数组,依次将每个元素与待查找值比较;介绍:“斐波那契查找原理与二分查找相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近。我们知道,斐波那契数列 F(k)={1,1,2,3,5,8,13,21…
2023-04-29 18:24:02
120
原创 字符串的相关练习
5.当匹配项不同时,将needle的指针重新指针第一个字符 同时haystack的第一个指针向后移。=s2,那么s1+s2是不等于s2+s1的,也就是str中间不包含s。3.变成了s3+s2+s1+s4,此时str中间就是s2+s1,如果s是循环字串。2.str就变成了s1+s2+s1+s2,去掉首尾,破环了首尾的s1和s2。4.也就是s1=s2,所以str中间的s2+s1就和原字符串相等。 3)重复操作,知道全部交换位置,就将字符串翻转了。1.假设字符串s是由s1+s2组成的,s+s后。
2023-04-29 15:56:41
363
原创 链表的相关题解
3.要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。3.再让两个指针同时移动,当right移动到最后一位时,left所指就是要删除节点的前一个。1.首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。4.找到要移除节点的前一位,然后让前一个节点的next指向下一个的下一个节点。4.当两个节点指向同一个节点时,让快的节点再次指向头节点,然后让他们同时移动。4.让两个指针同时移动,当两个指针指向同一个节点,就说明找到相交的节点了。
2023-04-26 22:00:49
48
原创 基数排序的实现
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。动态展示静态展示步骤一步骤二步骤三注意:1.基数排序是对传统桶排序的扩展,速度很快.2.基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError。3.基数排序时稳定的。
2023-04-26 18:09:09
83
原创 快速排序与归并排序
介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlYc8fOt-1682426877402)(E:\资料\博客\博客图片\归并排序静态图.png)]int tempLeft = left;
2023-04-25 20:48:52
47
原创 计算器的实现
计算器的实现基础是用栈的先进后出的特性的,将中缀表达式转换成后缀表达式后,对后缀表达式进行操作运算就会方便很多,而中缀表达式就是我们人类经常看到的表达式,例如(3+4)×5-6这就是中缀表达式,而后缀表达式就是相比于人来说,机器更容易看懂的表达式,例如(3+4)×5-6的后缀表达式是:3 4 + 5 * 6 -
2023-04-21 19:23:42
343
原创 前缀,中缀和后缀表达式
2.遇到 + 运算符,因此弹出 2 和 3( 2 为栈顶元素,3 为次顶元素,注意与后缀表达式做比较),计算出 2 + 3 的值,得 5,再将 5 入栈; 2)遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈。 2)遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈。2.遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;
2023-04-21 19:14:14
141
原创 螺旋矩阵的运用
螺旋矩阵,顾名思义,是一个旋转的矩阵,且经常按顺时针旋转遇到这类问题,最重要的是知道哪些是不变量,确定哪一行中的哪些数据要输出,哪一列中的哪些数据要输出。最好的解决办法就是按左闭右开的形式展开。
2023-04-20 09:32:55
95
原创 滑动窗口解决数组问题
滑动窗口就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果,如果用一个for循环,那么这个循环的索引,一定是表示滑动窗口的终止位置。实现滑动窗口,主要确定如下三点:1.窗口就是满足其和 ≥ s 的长度最小的连续子数组。2.窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。3.窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
2023-04-19 16:13:11
70
原创 双指针的相关练习
3.当快指针移动到所指元素的值不相等时,先将慢指针后移一位然后将快指针所指元素赋给慢指针所指的位置。2.当快慢指针所指的元素的值相等时,快元素向后移,慢指针不动,慢指针指向元素第一次出现的位置。3.right向前遍历,遇到目标值就向前移,直到遇到不是目标值,这时和left指针交换元素。1.定义两个指针(双指针法)通过一个快指针和慢指针在一个循环下完成两个循环的工作。2.比较两端的平方值的大小,将较大的平方值填入新数组的末尾,并向内移动指针。4.快指针 寻找新数组的元素 ,新数组就是不含有目标元素的数组。
2023-04-17 22:30:55
82
原创 双向链表的实现
4)temp.next.pre = temp.pre 注意,如果temp是链表的最后一个节点,那么就不需要执行这一步,因为temp.next为null,而null.pre会报空指针异常,所以这一步骤是要删除的节点不在最后即可。2.单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点(认真体会). 1)先创建一个临时节点用来存放比该节点大的后面的链表,cur = temp.next。
2023-04-17 10:29:35
37
原创 二分法查找算法
二分法:即将一个完整的个体分成两份,即中间取名为mid,左边为left,右边为right。然后将需要查找的数与mid对比,如果大于,则让left=mid,再次从中间取名mid,再次比较,以此往复,直到找完为止,同理需要查找的数小于mid也一样,只不过这次变得是right=mid。二分法查找有两种形式:第一种为左闭右闭型,即数值可以从两边判断/获取。第二种为左闭右开型,即数值只可以从左边判断/获取。最右边的取不到。
2023-04-16 10:37:40
101
原创 单向链表的实现
/定义节点 // data域 以水浒传为例 public int no;//排名 public String name;//next域 public HeroNode next;//节点构造器 public HeroNode(int no , String name , String nickname) {} }
2023-04-16 10:20:44
73
原创 环形队列的实现
判断队列是否满,因为这是一个环形队列所以不能用rear==maxSize-1来判断,我们知道rear指向队列尾的后一个位置,那么既然是环形的,后一个位置加一就是队列头的位置,这里要考虑既然是环形的就不能一直往上加,当超过最大或等于最大容量我们就取余,这样就避免了索引越界的异常。获取队列元素,出队,因为front指向的位置是队列头所在位置,那么就要先保存队列头所在位置,然后再将front后移,因为这是一个环形队列要考虑索引越界异常,所以后移的方法是front=(front+1)%maxSize。
2023-04-15 11:25:00
49
原创 数组实现简单队列
定义好了以后我们需要知道队列什么时候满了,当添加数据到队列时,队列头不动,队列尾加入数据,即rear先自增,然后加入数据,那么,当rear==maxSize-1(从零开始)时就表示队列已满。当我们测试以后会发现一个问题,就是这样实现以后队列只能用一次,为了解决这一问题我们引出环形队列的思想,请观看下集环形队列。出队列的时候,我们知道front指向队列头的前一个位置,那么将front后移就指的是队列头元素,即。我们为了更好地理解队列,就会自己写一个队列,这次我们用数组来实现队列。数组实现队列的完整代码。
2023-04-15 10:54:41
355
原创 稀疏数组的实现
稀疏数组是对二维数组进行简化,假如有一个棋盘,那么对棋盘的数据进行保存就会占很多内存,为了解决这一状况,就是用稀疏数组来简化二维数组。例如:以0为下棋点,1为黑棋,2为白棋 那么棋盘中有很多没有数据的点(即0),所以保存这样的数据用稀疏数组更合适。稀疏数组本质也是二维数组,它将棋盘中有效的数据提取出来,再次使用的时候,将有效数据展示出来就行了稀疏数组的第一行是个特殊行,从第二行开始,是数据保存的位置。
2023-04-15 10:28:35
33
原创 插入排序与希尔排序
插入排序:将待排序列的第一个元素看为有序序列,后面的元素看为未排序序列,从头到尾依次扫描未排序序列,将未排序序列插入到有序序列的合适位置。
2022-11-12 14:13:21
152
原创 第十一章 GUI
GUI: 全称是Graphical User Interface,即图形用户界面。顾名思义,就是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其他各种图形界面元素。目前,图形用户界面已经成为一种趋势,几乎所有的程序设计语言都提供了GUI设计功能。Java中针对GUI设计提供了丰富的类库,这些类分别位于java.awt和javax.swing包中,简称为AWT和Swing。...
2022-07-22 10:55:14
160
原创 第十章 线程
对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。线程是程序中独立的指令流。在VS编辑器中输入代码的时候,系统会分析代码,用下划线标注遗漏的分号和其他语法错误,这就是用一个后台线程完成。Word文档需要一个线程等待用户输入,另一个线程进行后台搜索,第三个线程将写入的数据存储在临时文件中。运行在服务器上的应用程序中等待客户请求的线程成为侦听器线程。进程包含资源。...
2022-07-21 10:26:27
125
原创 Lambda表达式&stream
Lambda表达式是一个匿名函数,我们可以把lambda表达式理解为一段可以传递的代码(将代码段像数据一样传递)。使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使java语言的表达式能力得到的提升。Lambda表达式的本质只是一个**“语法糖”**,由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。...
2022-07-18 14:53:46
203
原创 第九章 网络编程
计算机网络把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。有人说,20世纪最伟大的发明不是计算机,而是计算机网络。还有人说,如果你买了计算机而没有联网,就等于买了电话机而没有接电话线一样。Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。。...
2022-07-17 17:15:29
150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人