![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Scala数据结构与算法
蒙面小生
这个作者很懒,什么都没留下…
展开
-
二叉树-其它二叉树
其它二叉树线索二叉树。赫夫曼二叉树(哈夫曼树,最优二叉树)【编码,解码,数据压缩、解压】平衡二叉树(平衡二叉树,AVL树)【常用的实现方法右 红黑树,替罪羊树,伸展树等】B树B+树2-3树图...原创 2020-06-03 17:22:14 · 79 阅读 · 0 评论 -
二叉树-二叉排序树
二叉排序树给定一个数组(7,3,10,12,5,1,9),要求能够高效地完成对数组的查询和添加。二叉排序树,对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明,如果有相同的值,可以将该节点 放在左子节点或右子节点。二叉排序树的删除操作二叉排序树的删除情况比较复杂,有下面三种情况需要进行考虑:1)删除叶子节点(比如2,5,9,12)2)删除只有一颗子树的节点(比如1)3)删除有两颗子树的节点(比如:3,10)1)删除叶子节点删除原创 2020-06-03 17:18:51 · 312 阅读 · 0 评论 -
二叉树-顺序存储二叉树
顺序存储二叉树从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。规律n为数组下标,从0开始计算,最大值为arr.length-1。第n个元素的左子节点为2*n+1。第n个元素的右子节点为2*n+2。第n个元素的父节点为(n-1)/2。顺序二叉树一般只考虑完全二叉树。需求给定一个数组Array(1,2,3,4,5,6,7),要求以二叉树前序遍历的方式进行遍历。前序遍历的结果应当为1,2,4,5,3,6,7。中序遍历的结果应对为4,2,5原创 2020-06-03 17:08:01 · 275 阅读 · 0 评论 -
二叉树-删除节点
要求如果删除的节点是叶子节点,则删除该节点。如果删除的节点是非叶子节点,则删除树。测试删除5号叶子节点和3号树。代码实现package chapter18.binarytreeobject BinaryTreeDemo { def main(args: Array[String]): Unit = { //先使用比较简单的方法,直接关联 val root = new HeroNode(1, "宋江") val hero2 = new HeroNode(2,原创 2020-06-03 16:56:12 · 534 阅读 · 0 评论 -
二叉树-二叉树的查找
三种查找方式:前序查找、中序查找、后序查找。前序查找比较当前节点,如果是,返回查找结果。如果不是就向左递归查找,如果左边没有就向右边递归查找。设置no=5,针对该题,前序遍历共4次。中序遍历 先向左递归查找,如果左子树没有,再比较当前节点,如果仍然不是则向右遍历查找。后序遍历 先向左递归查找,如果左子树没有,就向右边子树递归查找,如果还没有,再比较当前节点。代码实现package chapter18.binarytreeobject BinaryTreeDemo { def mai原创 2020-06-03 16:52:26 · 797 阅读 · 0 评论 -
哈希表(散列)
哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫散列函数,存放记录的数组叫做散列表。google公司上机题有一个公司,当有新的员工来报到时,要求将该员工的信息加入(id,性别,年龄,住址,…),当输入该员工的id时,要求查找到该员工的所有信息。要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)分析代码实现pac原创 2020-06-03 16:31:22 · 159 阅读 · 0 评论 -
查找-二分查找
查找所有满足条件的值:(1, 8, 10, 89, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1234) ,当一个有序数组中,有多个相同的数时,如何将所有的数值都查找到,比如这里的1000。代码实现package chapter18.searchimport scala.collection.mutable.ArrayBufferimport util.control.Breaks._object BinarySearch { def原创 2020-06-03 16:19:17 · 133 阅读 · 0 评论 -
排序-4.归并排序(mergeSort)
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。代码实现package chapter18.sortimport java.text.SimpleDateFormatimport java.util.Dateobject MergeSort { def main(args: Array[St原创 2020-06-03 16:13:41 · 129 阅读 · 0 评论 -
排序-4.快速排序
快速排序是对冒泡排序法的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。实例:要求:对[11, 10, 9, 1, -1]进行从小到大的排序,要求使用快速排序法。代码实现package chapter18.sortimport java.text.SimpleDateFormatimport java.util原创 2020-06-03 15:23:17 · 113 阅读 · 0 评论 -
排序-3.插入排序
插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。基本思想把n个待排序的元素看成一个有序表和一个无序表,开始时有序表只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。代码实现package chapter18.sortimport java.text.SimpleDateFormatimport java.util.Dat原创 2020-06-03 14:50:27 · 117 阅读 · 0 评论 -
排序-2.选择排序(selectSort)
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其它元素重整,再依规定(从小到大/从大到小)交换位置后达到排序的目的。基本思想第一次从R[0]-R[n-1]中选取最小值,与R[0]交换;第二次从R[1]-R[n-1]中选取最小值,与R[1]交换;第三次从R[2]-R[n-1]中选取最小值,与R[2]交换;…,第i次从R[i-1]-R[n-1]中选取最小值,与R[i-1]交换;…,第n-1次从R[n-2]-R[n-1]中选取最小值,与R[n-2]交换;总共通过n原创 2020-06-02 18:06:11 · 277 阅读 · 0 评论 -
排序-1.冒泡排序(bubbleSort)
排序的介绍排序是将一组数据,依指定的顺序进行排列的过程,常见的排序:1)冒泡排序。2)选择排序。3)插入排序。4)快速排序。【递归】5)归并排序。【递归】冒泡排序(bubbleSort)基本思想通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部向前部(从下标较大的单元移向下标较小的单元),就像水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要原创 2020-06-02 17:57:03 · 396 阅读 · 0 评论 -
递归(recursive)-迷宫回溯问题
思路分析创建一个二维数组(表示地图)。约定不同的数字表示不同的含义。元素的值,0:表示可以走还没走过,1:墙,2:表示可以走,3:表示已经走过了,但是是死路。确定一个策略。下->右->上->左。代码实现package chapter18.recursiveobject MiGong { def main(args: Array[String]): Unit = { //地图 val map = Array.ofDim[Int](8, 7) //原创 2020-06-02 17:32:30 · 192 阅读 · 0 评论 -
递归(recursive)-入门
递归就是函数/方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归案例:打印案例/斐波那契数列。打印案例递归调用的机制的重要原则:1.当我们调用一个方法或函数时,就会开一个独立的栈空间,数据是独立的。代码实现package chapter18.recursiveobject RecursiveDemo { def main(args: Array[String]): Unit = { test(4) //2,3,4 }原创 2020-06-02 17:22:09 · 678 阅读 · 0 评论 -
栈(stack)-栈实现简单计算器
使用栈来实现综合计算器-自定义优先级[priority]expression =”3+2*6-2” = 13思路1)设计两个栈,一个存数值【数栈】,一个存符号【符号栈】。2)对expression进行扫描,一个一个取出。3)当取出的字符是数时,就直接入数栈。4)当取出的字符时符号时:4.1)如果当前符号栈没有数据,就直接入栈。4.2)如果当前符号的优先级小于等于符号栈的栈顶的符号的优先级,则取出该符号,并从数栈依次pop两个数据进行运算,将结果重新push到数栈,再将当前符号push到符号原创 2020-06-02 17:15:01 · 606 阅读 · 0 评论 -
栈(stack)-入门
栈的基本介绍栈是一个先入后出(FILO-First In Last Out)的有序列表。栈式限制线性表中的元素的插入和删除只能在同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底。根据堆栈的定义可以,最先放入的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。栈的应用场景子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中原创 2020-06-02 16:49:58 · 227 阅读 · 0 评论 -
链表(LinkedList)-单向环形链表
3.单向环形链表的应用场景Josephu问题(丢手帕问题)设编号为1,2,…,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表原创 2020-06-02 16:35:46 · 410 阅读 · 0 评论 -
链表(LinkedList)-双向链表
2.双向链表的应用实例使用带head头的双向链表实现-水浒英雄排行榜管理。单向链表的缺点分析:1)单向链表,查找的方向只能是一个方向,而双向链表可以向前或向后查找。2)单向链表不能自我删除,需要靠辅助结点,而双向链表,则可以自我删除,所以前面我们单链表删除结点时,总是找到temp的下一个结点来删除的。将前面的单向链表改成双向链表。代码实现package chapter18.linkedListimport scala.util.control.Breaks.{break, breakab原创 2020-06-02 16:15:03 · 236 阅读 · 0 评论 -
链表(LInkedList)-单链表
链表是有序的列表,但是它在内存中是存储如下:小结:1)链表是有序列表。2)链表的数据,在内存空间不一定是连续分布的。分类:带头节点的链表。链表的头有一个head结点,该结点不存放具体的数据,只是为了操作方便而设计的这个结点。不带头节点的链表。1.单链表的应用实例使用带head头的单向链表实现-水浒英雄排行榜管理。1)完成对英雄人物的增删改查,注:删除和修改,查找可以考虑学员独立完成。2)第一种方法在添加英雄时,直接添加到链表的尾部。3)第二种方式在添加英雄时,根据排名将英雄原创 2020-06-02 15:29:02 · 287 阅读 · 0 评论 -
队列(Queue)
队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据要先取出。后存入的要后取出。数组模拟队列队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下。其中,maxSize是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变。如图所示:代码实现package chapter18import sca原创 2020-06-02 15:09:23 · 209 阅读 · 0 评论 -
稀疏数组
基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。处理方法:1)记录数组一共有几行几列,有多少个不同的值。2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。实际需求:编写的五子棋程序中,有存盘退出和续上盘的功能。举例说明:应用案例:使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等)把稀疏数组存盘,并且可以从新恢复原来的二维数组代码实现:package chapter18import java.io.原创 2020-06-02 14:24:04 · 117 阅读 · 0 评论