数据结构与算法
文章平均质量分 61
徐小白升职记
这个作者很懒,什么都没留下…
展开
-
程序员常用10种算法
https://blog.csdn.net/houwanle/article/details/110746745转载 2021-06-17 14:37:59 · 372 阅读 · 0 评论 -
面试高频必问-图
图1、图基本介绍1.1、为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时,这里我们就用到了图。1.2、图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。如图:1.3、图的常用概念顶点(vertex)边(edge)路径无向图(右图有向图带权图2、图的表示方式图的表示方式有两种:二维数组表示(邻接矩阵);链表表示转载 2021-06-17 14:33:33 · 175 阅读 · 0 评论 -
面试高频必问-二叉排序树
二叉排序树1、先看一个需求给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加2、解决方案分析使用数组数组未排序,优点:直接在数组尾添加,速度快。缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。使用二叉排序树3、二叉排序树介绍二叉排序树:BST:(Binary原创 2021-06-09 11:01:44 · 136 阅读 · 0 评论 -
面试高频必问-赫夫曼编码
赫夫曼编码1、基本介绍赫夫曼编码也翻译为哈夫曼编码(HuffmanCoding),又称霍夫曼编码,是一种编码方式,属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码2、原理剖析通信领域中信息的处理方式1-定长编码通信领域中信息的处理方式2-变长编码通信领域中信息的处理方式3-赫夫曼编码传输的字符串原创 2021-05-17 17:44:11 · 505 阅读 · 0 评论 -
高频面试必问-赫夫曼树
赫夫曼树1、基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree),还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近2、赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:转载 2021-05-17 14:03:52 · 381 阅读 · 0 评论 -
高频面试必问-堆排序
堆排序1、堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明小顶堆举例说明一般升序采用大顶堆,降序采用小顶堆2、堆排序基本思想3、堆排序步骤图解说明4、堆排序代码实现.转载 2021-05-17 14:02:09 · 286 阅读 · 0 评论 -
面试高频必问-线索化二叉树
线索化二叉树1、先看一个问题将数列{1,3,6,8,10,14}构建成一颗二叉树.n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为{8,3,10,1,6,14}但是6,8,10,14这几个节点的左右指针,并没有完全的利用上.如果我们希望充分的利用各个节点的左右指针,让各个节点可以指向自己的前后节点,怎么办?解决方案-线索二叉树2、线索二叉树基本介绍n个结点的二叉链表中含有n+1【公式2n-(n-1)=n+1】个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍原创 2021-05-13 17:40:37 · 308 阅读 · 0 评论 -
面试高频必问-顺序存储二叉树
顺序存储二叉树1、顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看右面的示意图。要求:右图的二叉树的结点,要求以数组的方式来存放arr:[1,2,3,4,5,6,6]要求在遍历数组arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n+1第n个元素的右子节点为2*n+2第n个元素的父节点为(n-1)/转载 2021-05-13 11:49:07 · 61 阅读 · 0 评论 -
面试高频必问-二叉树
二叉树1、为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低操作示意图:链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)操作示意图:树存储方式的分析能提高数据存储,读取的效率,比原创 2021-05-13 09:54:59 · 423 阅读 · 0 评论 -
面试必问-查找算法
查找算法1、查找算法介绍在java中,我们常用的查找有四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找2、线性查找算法有一个数列:{1,8,10,89,1000,1234},判断数列中是否包含此名称【顺序查找】要求:如果找到了,就提示找到,并给出下标值。package com.xu.search;public class SeqSearch { public static void main(String[] args) { int arr[]原创 2021-05-12 17:03:18 · 369 阅读 · 0 评论 -
数据结构-哈希表
哈希表1、哈希表的基本介绍2、google公司的一个上机题转载 2021-05-12 17:02:34 · 94 阅读 · 0 评论 -
常用排序算法总结和对比
常用排序算法总结和对比1、一张排序算法的比较图2、相关术语解释稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度:一个算法执行所耗费的时间。空间复杂度:运行完一个程序所需内存的大小。n:数据规模k:“桶”的个数In-place:不占用额外内存Out-place:占用额外原创 2021-05-11 13:57:23 · 86 阅读 · 0 评论 -
面试必问-基数排序
基数排序(桶排序)1、基数排序(桶排序)介绍基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(RadixSort)是桶排序的扩展基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。2、基原创 2021-05-11 13:56:53 · 115 阅读 · 0 评论 -
面试必问-归并排序
归并排序1、归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。2、归并排序思想示意图1-基本思想3、归并排序思想示意图2-合并相邻有序子序列:再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,转载 2021-05-11 13:56:13 · 200 阅读 · 0 评论 -
面试必问-快速排序
快速排序1、快速排序法介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列2、快速排序法示意图3、快速排序法应用实例package com.xu.sort;import java.text.SimpleDateFormat;import java.util.Date;pu原创 2021-05-11 13:55:44 · 141 阅读 · 0 评论 -
面试必问-希尔排序-性能优化
希尔排序1、简单插入排序存在的问题我们看简单的插入排序可能存在的问题.数组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}结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.2、希尔排序法介绍希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序原创 2021-05-11 13:54:55 · 183 阅读 · 0 评论 -
跳槽面试必问-插入排序
插入排序1、插入排序法介绍:插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。2、插入排序法思想:插入排序(InsertionSorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。3、插入排序思路图:4、插入排序法应用实例:pack原创 2021-05-08 09:22:10 · 82 阅读 · 0 评论 -
跳槽面试必问-选择排序
选择排序1、基本介绍2、选择排序思想:3、选择排序思路分析图:4、选择排序应用实例:原创 2021-05-07 14:00:44 · 82 阅读 · 0 评论 -
跳槽面试必问-冒泡排序
冒泡排序1、基本介绍冒泡排序(BubbleSorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)2、演示冒泡过程的例子(图解)小结上面的图解原创 2021-04-29 10:39:36 · 104 阅读 · 0 评论 -
跳槽面试必问-排序算法
排序算法1、排序算法的介绍排序也称排序算法(SortAlgorithm),排序是将一组数据,依指定的顺序进行排列的过程。2、排序的分类内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。常见的排序算法分类(见下图):3、算法的时间复杂度3.1、度量一个程序(算法)执行时间的两种方法事后统计的方法这种方法可行,但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该原创 2021-04-28 09:27:00 · 188 阅读 · 0 评论 -
面试高频必问算法-八皇后问题(递归)
递归1、应用场景看个实际应用场景,迷宫问题(回溯),递归(Recursion)2、概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。3、调用机制1)打印问题2)阶乘问题3)使用图解方式说明了递归的调用机制4、递归能解决什么样的问题1)各种数学问题如:8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.3)将用栈解原创 2021-04-27 11:21:22 · 223 阅读 · 0 评论 -
栈
栈1、栈的一个需求2、栈的介绍3、栈的应用场景4、栈的快速入门5、栈实现综合计算器(中缀表达式)6、逆波兰计算器7、中缀表达式转换为后缀表达式7.1、具体步骤7.2、举例说明7.3、代码实现8、逆波兰计算器完整版...原创 2021-04-26 13:52:55 · 89 阅读 · 0 评论 -
链表
链表1、链表(LinkedList)介绍链表是有序的列表,但是它在内存中是存储如下1)链表是以节点的方式来存储,是链式存储2)每个节点包含data域,next域:指向下一个节点.3)如图:发现链表的各个节点不一定是连续存储.4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点)逻辑结构示意图如下2、单链表的应用实例使用带head头的单向链表实现–水浒英雄排行榜管理完成对英雄人物的增删改查操作1)第一种方法在添加英雄时,直接添加到链表的尾部思路分析示意原创 2021-04-23 17:34:31 · 8599 阅读 · 0 评论 -
队列
队列1、使用场景银行排队的案例:四个窗口处理请求,同一个时间内一个窗口只能处理一个请求,若干人依次排队。2、介绍1)队列是一个有序列表,可以用数组或是链表来实现。2)遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出3)示意图:(使用数组模拟队列示意图)3、数组模拟队列思路队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear原创 2021-04-22 15:09:50 · 82 阅读 · 0 评论