![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法 java版
算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算;掌握数据结构和算法是一个高级程序员必要的;
奋斗小亮
DayDayUp
展开
-
30.图
问题:为什么要有图?前面我们学了线性表(一对一)和树(一对多)线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要 表示多对多的关系时, 这里我们就用到了 图图的举例说明:图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图: 图的常用概念顶点(verte...原创 2020-03-11 20:57:38 · 258 阅读 · 0 评论 -
29.树结构实际应用---多路查找树
① 二叉树与B树二叉树的问题分析二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就存在如下问题:问题 1:在构建二叉树时,需要多次进行 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题 2:节点海量,也会造成二叉树的...原创 2020-03-10 21:36:26 · 273 阅读 · 0 评论 -
28.树结构实际应用---平衡二叉树(AVL树)
看一个案例(说明二叉排序树可能的问题)基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。举例说明, 看看...原创 2020-03-10 21:09:55 · 348 阅读 · 0 评论 -
27.树结构实际应用---二叉排序树
先看一个需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加解决方案分析使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表,不管链表是否有序,查找速度都慢,添加数...原创 2020-03-10 20:50:23 · 242 阅读 · 0 评论 -
26.树结构实际应用---赫夫曼树
待更新原创 2020-03-10 20:34:22 · 162 阅读 · 0 评论 -
25.线索化二叉树
先看一个问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案---- 线索二叉...原创 2020-03-09 21:02:25 · 79 阅读 · 0 评论 -
24.顺序存储二叉树
基本说明:从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图要求:上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第 n 个元素的左...原创 2020-03-09 20:38:22 · 120 阅读 · 0 评论 -
23.二叉树
二叉树为什么需要树这种数据结构数组存储方式的分析优点:通过 下标方式访问元素,速度快。对于有序数组,还可使用 二分查找提高检索速度。缺点:如果要检索具体某个值,或者 插入值( 按一定顺序) 会整体移动,效率较低画出操作示意图:链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如: 插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行 检...原创 2020-03-07 12:01:42 · 147 阅读 · 0 评论 -
22.哈希表
哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。案例:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时,要求查找到该员工的...原创 2020-03-07 11:05:57 · 124 阅读 · 0 评论 -
21.查找算法
查找算法介绍在java中,我们常用的查找有四种:1) 顺序(线性)查找2) 二分查找/折半查找3) 插值查找4) 斐波那契查找线性查找算法1.顺序(线性)查找有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值public class SeqSearch {//顺序(线性)查找 ...原创 2020-03-06 22:31:48 · 154 阅读 · 0 评论 -
20.排序算法(树结构实际应用)---堆排序
堆排序 待更新原创 2020-03-06 22:10:32 · 229 阅读 · 0 评论 -
19.排序算法---基数排序
基数排序(桶排序)介绍:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序(相同元素的位置排序后,前面的还是在前面),基数排序法的是效率高的 稳定性排序法基数排序(Radix S...原创 2020-03-06 22:08:04 · 122 阅读 · 0 评论 -
18.排序算法---归并排序
归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序思想示意图1-基本思想:说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现...原创 2020-03-06 21:51:04 · 275 阅读 · 0 评论 -
17.排序算法---快速排序
快速排序法介绍:**快速排序(Quicksort)**是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序法示意图:快速排序法应用实例:要求: 对 [-9,78,0,23,-567,70] 进行从小...原创 2020-03-06 21:42:23 · 261 阅读 · 0 评论 -
16.排序算法---希尔排序
简单插入排序存在的问题:数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.希尔排序法介绍:希尔排序是希尔(Don...原创 2020-03-06 21:32:07 · 258 阅读 · 0 评论 -
15.排序算法---插入排序
插入排序法介绍:插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想:插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序...原创 2020-03-05 22:08:52 · 156 阅读 · 0 评论 -
14.排序算法---选择排序
基本介绍:选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序思想:选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]arr[n-1]中选取...原创 2020-03-05 21:59:39 · 209 阅读 · 0 评论 -
13.排序算法---冒泡排序
排序算法的介绍冒泡排序冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减...原创 2020-03-05 21:52:27 · 207 阅读 · 0 评论 -
12.算法的时间复杂度
度量一个程序(算法)执行时间的两种方法1) 事后统计的方法,这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快。2) 事前估算的方法,通过分析某个算法的时间复杂度来判断哪个算法更优.时间频度基本介绍时间频度:一个算法花费的...原创 2020-03-05 21:23:34 · 103 阅读 · 0 评论 -
11.递归(迷宫问题)
递归的概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归用于解决什么样的问题各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.将用栈解决的问题–>递归代码比较简洁递归需要遵守的重要规则1).执行一个方法时,...原创 2020-03-05 21:07:49 · 120 阅读 · 0 评论 -
10.中缀表达式转后缀表达式(逆波兰表达式)
后缀表达式(逆波兰表达式)**后缀表达式又称逆波兰表达式,**与前缀表达式相似,只是运算符位于操作数之后中举例说明: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 –再比如:中缀表达式转换为后缀表达式初始化两个栈:运算符栈s1和储存中间结果的栈s2;从左至右扫描中缀表达式;遇到操作数时,将其压s2;遇到运算符时,比较其与s1栈顶运算符的优先...原创 2020-03-05 20:46:33 · 228 阅读 · 0 评论 -
9.栈实现综合计算器(中缀表达式)
使用栈来实现综合计算器思路分析(图解)public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 Array...转载 2020-03-04 23:24:07 · 126 阅读 · 0 评论 -
8.数组模拟栈
栈的介绍栈的英文为(stack)栈是一个 先入后出(FILO-First In Last Out) 的有序列表。栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表 。 允许插入和删除的一端,为 变化的一端,称为栈顶(Top) ,另一端为 固定的一端,称为栈底(Bottom) 。根据栈的定义可知 , 最先放入栈中元素在栈底 , 最后放入的元素在栈顶 ,...原创 2020-03-04 23:18:26 · 167 阅读 · 0 评论 -
7.单向环形链表
一个问题的思考:丢手帕问题Josephu(约瑟夫、约瑟夫环) 问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个...原创 2020-02-26 21:57:03 · 115 阅读 · 0 评论 -
6.双向链表
使用带head头的双向链表实现 –水浒英雄排行榜 管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除, 所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点代码实现public class DoubleLinke...原创 2020-02-25 22:08:38 · 97 阅读 · 0 评论 -
5.单向链表
链表是有序的列表,但是它在内存中是存储如下小结:1.链表是以节点的方式来存储,是链式存储2.每个节点包含 data 域, next 域:指向下一个节点.3.如图:发现链表的各个节点不一定是连续存储.4.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下:需求:使用带head头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增...原创 2020-02-25 21:57:51 · 109 阅读 · 0 评论 -
4.数组模拟环形队列
对前面的数组模拟普通队列的优化,充分利用数组资源. 因此将数组看做是一个环形的。(通过取模的方式来实现即可)public class CircleArrayQueueDemo { public static void main(String[] args) { System.out.println("测试数组模拟环形队列的案例~~~"); // 创建一个环形队列 Ci...原创 2020-02-25 21:41:42 · 91 阅读 · 0 评论 -
3.数组模拟普通队列
队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图)public class ArrayQueueDemo { public static void main(String[] args) { //创建一个队列 ArrayQueue queue = new ArrayQueue(3)...原创 2020-02-25 21:34:42 · 114 阅读 · 0 评论 -
2.稀疏数组
先看一个实际的需求分析问题:因为该二维数组的很多值是默认值 0, 因此记录了 很多没有意义的数据.-> 稀疏数组。基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组 一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而 缩小程序的规模稀疏数组举例说明原始数组是...原创 2020-02-24 22:12:09 · 155 阅读 · 0 评论 -
1.数据结构和算法概述
几个经典的算法面试题开启算法之旅1.字符串匹配问题:有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1要求用最快的速度来完成匹配你的思路是什么? 暴力匹配 [简单,但是效率低] KMP 算法《部分匹配表》...原创 2020-02-24 21:58:06 · 139 阅读 · 0 评论