
数据结构与算法java版
文章平均质量分 92
数据结构与算法java版
众里寻她千百回
大数据推荐系统
展开
-
大厂程序员必备十大基础算法 -- 马踏棋盘算法
1. 马踏棋盘算法(骑士周游)1.1 马踏棋盘游戏介绍马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格游戏演示: http://www.4399.com/flash/146267_2.htm1.2 马踏棋盘游戏完成思路马踏棋...原创 2020-04-24 23:04:39 · 513 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 弗洛伊德算法
1. 弗洛伊德算法1.1 应用场景-最短路径问题胜利乡有 7 个村庄(A, B, C, D, E, F, G)各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何计算出各村庄到 其它各村庄的最短距离?1.2 弗洛伊德(Floyd)算法介绍和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算...原创 2020-04-22 20:53:10 · 597 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 迪杰斯特拉算法
1. 迪杰斯特拉算法1.1 应用场景-最短路径问题看一个应用场景和问题:战争时期,胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何计算出 G 村庄到 其它各个村庄的最短距离?如果从其它点出...原创 2020-04-21 23:23:31 · 573 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 克鲁斯卡尔算法
1. 克鲁斯卡尔算法1.1 应用场景-公交站问题看一个应用场景和问题:某城市新增 7 个站点(A, B, C, D, E, F, G) ,现在需要修路把 7 个站点连通各个站点的距离用边线表示(权) ,比如 A – B 距离 12 公里问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短?1.2 最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子...原创 2020-04-20 20:46:17 · 550 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 普里姆算法
1. 普里姆算法1.1 应用场景-修路问题看一个应用场景和问题:有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? 思路: 将 10 条边,连接即可,但是总的里程数不是最小.正确的思路,就是尽可能的选择少...原创 2020-04-16 21:26:16 · 528 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 贪心算法
1. 贪心算法1.1 应用场景-集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号1.2 贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都...原创 2020-04-15 23:17:21 · 515 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- KMP算法
1. KMP 算法1.1 应用场景-字符串匹配问题字符串匹配问题:有一个字符串 str1= “010101010101010010101010101”,和一个子串 str2=“0101010100”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-11.2 暴力匹配算法如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置...原创 2020-04-15 22:59:40 · 493 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 动态规划算法
1. 动态规划算法1.1 应用场景-背包问题背包问题:有一个背包,容量为 4 磅 , 现有如下物品要求达到的目标为装入的背包的总价值最大,并且重量不超出要求装入的物品不能重复1.2 动态规划算法介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求...原创 2020-04-15 21:37:03 · 411 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 分治算法
1. 分治算法1.1 分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索大整数乘法...原创 2020-04-14 22:08:09 · 298 阅读 · 0 评论 -
大厂程序员必备十大基础算法 -- 二分查找算法(非递归)
1. 二分查找算法(非递归)1.1 二分查找算法(非递归)介绍前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的队列(100 个数,即 n=100)中寻到目标数 ...原创 2020-04-14 21:37:42 · 253 阅读 · 0 评论 -
进大厂必备的数据结构知识 -- 图的介绍以及遍历
图1.1 图基本介绍1.1.1 为什么要有图前面的博客介绍了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图。1.1.2 图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:1.1.3 图的常用概念顶点(verte...原创 2020-04-14 21:28:24 · 321 阅读 · 0 评论 -
什么面试官问的B树、B+树、B*树,你还不懂?
多路查找树1.1 二叉树与B 树1.1.1 二叉树的问题分析二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就存在如下问题:问题 1:在构建二叉树时,需要多次进行 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时, 速度有影响问题 2:节点海量,也会造成二...原创 2020-03-24 20:19:59 · 621 阅读 · 1 评论 -
平衡二叉树窥秘
平衡二叉树(AVL 树)1.1二叉排序树可能的问题给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST)。上边 BST 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)1.2 基本介绍...原创 2020-03-22 19:37:07 · 239 阅读 · 0 评论 -
春招某大厂:不会二叉排序树还想进来?
前言2020 注定是多灾多难的一年,疫情尚未完全散去,不少大厂已经开始了疯狂挖人,于是笔者难耐寂寞向某一线互联网大厂投了一份简历,开始了被虐之旅。。。。于是笔者在一个寂静的夜晚痛定思痛,总结数据结构面试相关的文章,希望能帮助各位读者以后面试百战百胜,对面试官进行绝地反击,吊打问你的面试者,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!正文面试官: 你了解二叉排序树吗?我: 了解一点...原创 2020-03-19 21:56:41 · 239 阅读 · 0 评论 -
什么?听说你还不用java实现文件的压缩与解压!
1. 赫夫曼编码1.1 基本介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法。赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在 20%~90%之间。赫夫曼码是可变字长编码(VLC)的一种。Huffman 于 1952 年提出一种编码方法,称之为最佳编码。1.2...原创 2020-03-14 22:58:32 · 331 阅读 · 1 评论 -
树的实际应用 -- 赫夫曼树与赫夫曼编码(一)
1 赫夫曼树1.1 基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近1.2 赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的...原创 2020-03-13 22:38:54 · 315 阅读 · 0 评论 -
二叉树(四) -- 堆排序
1 .堆排序1.1 堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说...原创 2020-03-09 22:14:24 · 430 阅读 · 0 评论 -
二叉树(三) -- 线索化二叉树
1.线索化二叉树1.1 先看一个问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. 问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案-...原创 2020-02-29 22:08:05 · 420 阅读 · 0 评论 -
二叉树(二) -- 二叉树的顺序存储
1.顺序存储二叉树1.1 顺序存储二叉树的概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组, 看下面的示意图要求:上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历由上图可知顺序存储二叉树的特点...原创 2020-02-26 23:14:35 · 655 阅读 · 0 评论 -
二叉树(一) -- 二叉树的概念与遍历(前序、中序、后序)、查找以及删除结点
1 二叉树1.1 为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低操作示意图:链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,...原创 2020-02-25 22:40:16 · 310 阅读 · 0 评论 -
哈希表(数组+链表实现)
1.1 哈希表(散列)实际需求- 某公司上机题有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id 时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)1.2 哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结...原创 2020-02-23 11:32:16 · 3554 阅读 · 0 评论 -
查找算法 -- 线性、二分、插值、斐波那契
1.1 查找算法介绍在 java 中,我们常用的查找有四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找1.2 线性查找算法有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含某个指定的数。 要求: 如果找到了,就提示找到,并给出下标值。代码实现public class SeqSearch { public static vo...原创 2020-02-22 18:27:40 · 311 阅读 · 0 评论 -
排序算法(四) -- 归并排序、基数排序
1.归并排序1.1 归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。1.2 归并排序思想示意图 1-基本思想:1.3 归并排序思想示意图 2-合并相邻有...原创 2020-02-21 16:12:18 · 538 阅读 · 1 评论 -
排序算法(三) -- 希尔、快排
1.希尔排序1.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}结论: 当需要插入的数是较小的数时,后移的次数明显...原创 2020-02-21 13:06:19 · 386 阅读 · 0 评论 -
排序算法(二) -- 冒泡、选择、插入排序
1.冒泡排序1.1 基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行...原创 2020-02-19 15:32:12 · 184 阅读 · 0 评论 -
排序算法(一) -- 算法的时间复杂度和空间复杂度
1.排序算法的介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。2.排序算法的分类内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。常见的排序算法分类(见右图):3. 算法的时间复杂度3.1 度量一个程序(算法)执行时间...原创 2020-02-19 11:14:49 · 661 阅读 · 0 评论 -
递归--迷宫问题、八皇后问题
1.1 递归应用场景看个实际应用场景,迷宫问题(回溯): 图中红色部分为迷宫的围墙,小球从开始的位置,走到右下角箭头所指位置,求一条可以走通的路1.2 递归的概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。1.3 递归调用机制列举小案例,来帮助大家理解递归,回顾一下递归调用机制:以上代码的执行过程图解如...原创 2020-02-16 18:58:49 · 589 阅读 · 0 评论 -
栈(二) -- 前缀、中缀、后缀表达式以及中缀转后缀简易计算器实现
前缀表达式(波兰式表达式)1.1 前缀表达式的介绍前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前,如 (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 61.2 前缀表达式的计算机求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最...原创 2020-02-16 09:12:23 · 507 阅读 · 0 评论 -
栈(一) -- 栈的基本介绍
1.1 栈的一个实际需求请输入一个表达式计算式:[722-5+1-5+3-3] 点击计算【如下图】请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 -5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈1.2 栈的介绍栈的英文为(stack)栈是一个...原创 2020-02-13 22:56:57 · 521 阅读 · 0 评论 -
链表(二) -- 单向环形链表(约瑟夫环)
1.单向环形链表应用场景Josephu(约瑟夫、约瑟夫环) 问题Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。单向环形链表介绍单向链表中最后一个节点的ne...原创 2020-02-12 22:05:50 · 291 阅读 · 0 评论 -
链表(一) -- 单链表与双向链表
1.1 什么是链表?链表是有序的列表,但是它在内存中是存储如下特点如下:链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下1.2 单链表的应用实例使用带head头的单向链表实现 –水...原创 2020-02-12 21:41:12 · 1601 阅读 · 0 评论 -
稀疏数组和队列
1. 稀疏 sparsearray 数组1.1 先看一个实际的需求编写的五子棋程序中,有存盘退出和续上盘的功能。分析问题 : 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据1.2 基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值,即稀疏数组的第一...原创 2020-02-12 11:23:30 · 283 阅读 · 0 评论