随笔分类 - 数据结构与算法
摘要:马踏棋盘算法详解 说明 马踏棋盘是指在一个8 * 8的国际棋盘上,从某一位置开始,每次走一个日字,将所有的位置都走一遍 可以使用递归 + 回溯来解决,再加上贪心算法来优化 指定某种策略,因为从棋盘的某一位置开始走,它的下一步最多有8个选择,编写一个方法,将下一步能走的位置记录在集合中 创建一个Boo
阅读全文
摘要:弗洛伊德算法详解 说明 弗洛伊德算法也是求一个顶点到其他顶点的最短路径问题,和迪杰斯特拉算法有共同之处,不同处在于迪杰斯特拉算法只是求得某一具体的顶点到其他顶点的最短距离,而弗洛伊德会求出所有的顶点到其他顶点的距离,弗洛伊德会创建一个二维距离数组保存各个顶点到其它顶点的距离,通过不断的更新这个二维数
阅读全文
摘要:迪杰斯特拉算法详解 说明 迪杰斯特拉算法是求解带权无向图中某一顶点到其他顶点的最短路径问题 核心思想为定义一个数组保存当前顶点到其他顶点的距离,然后通过广度优先算法,即横向扫描的方式,不断比较不同走法的路径大小,将最小路径对应的权值记录在数组中 每次在更新路径时,路径权值应当包含两部分,一是路径数组
阅读全文
摘要:克鲁斯卡尔之公交车站问题详解 说明 克鲁斯卡尔算法也是解决图的最短路径问题,即给定一个带权的无向图,求其最小生成树使得各个顶点之间的距离最短 公交车站问题是指有七个公交车站,修一条通路连接这七个公交车站,使得路劲最短 可以使用带权的无向图来模拟公交车站问题,因此可以使用克鲁斯卡尔算法解决 克鲁斯拉尔
阅读全文
摘要:普利姆算法之最短路径问题详解 说明 普利姆算法是一个求最短路径的算法,即给定一个带权的无向图,求一条路径使得将这些节点连接后带权路径最短,即如何生成最小生成树 以修路问题为例,假设有7个村庄,修一条通路连接这7个村庄,但是要求路径最短 使用无向图来模拟,图的顶点为村庄,带权路径为村庄的通路,则转化为
阅读全文
摘要:贪心算法之集合覆盖问题详解 说明 贪心算法是指在对某一问题求解时,每一步都寻找最优解的一种思路 集合覆盖问题指有多个电台,每个电台都可以覆盖一定的区域,求可以覆盖所有地区的最小电台数量 使用贪心算法求得的解不一定是最优解,但是接近最优解 电台覆盖问题思路??? 先用集合记录要覆盖的所有区域,然后遍历
阅读全文
摘要:KMP算法详解 说明 KMP算法是一种字符串查找算法,能较高效的从一个长字符串中匹配到模式串,即子串 KMP算法是暴力匹配算法的升级版,主要优化了暴力匹配在每次回溯时从当前匹配字符的下一个字符开始匹配的问题,因为有些字符已经匹配过 KMP核心思想为改变每次匹配失败回溯时的下一个字符位置问题,即不是从
阅读全文
摘要:字符串暴力匹配算法详解 说明 字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串 所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对 从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符 如果第一个字符就不相等,则通过指针后移依
阅读全文
摘要:动态规划之背包问题详解 说明 动态规划也是一种将复杂问题拆解为许多子问题的一种算法,与分治算法类似,只不过动态规划拆解后的子问题是互相有关联的,而分治拆解后的子问题彼此没有关联 背包问题是指有一堆物品,每个物品都有自己的价格,现有一个背包,有一定的存储容量,现要求背包能存储物品的最大价值为多少,即背
阅读全文
摘要:分治 + 递归之汉诺塔问题详解 说明 分治算法,即分而治之算法,将一个复杂的问题先拆分成许多简单的类似的小模块,对这些简单的小模块进行处理过后,再将这些小模块合并到一起,实现分而治的操作 汉诺塔是指有三个塔A,B,C,A塔有n个按照顺序排放好的盘子,如何将这n个盘子移动到C塔,大盘子不能放置在小盘子
阅读全文
摘要:二分查找(非递归)详解 说明 二分查找具有很高的查找效率,但是要求要查找的数组必须是有序的,如果是无序的,在查找前必须对其进行排序,否则会出问题 二分查找采用折半查找的思路,时间复杂度为对数阶,每次都判断要查找的值和数组中间值的大小关系 如果数组中间值元素等于要查找的值,说明找到,直接返回 如果中间
阅读全文
摘要:图的广度优先遍历详解 说明 广度优先遍历,及先对图的某个指定的顶点横向扫描,输出所有与当前顶点相连的邻接顶点的信息 需要使用队列记录节点访问的顺序,先从指定顶点开始扫描,每次扫描到一个新顶点,输出新顶点的信息,然后将这个顶点设置为已访问,再将这个顶点加入队列 当 当前顶点相连的多个邻接顶点信息全部输
阅读全文
摘要:图的深度优先遍历详解 说明 深度优先遍历,即先向纵深处挖掘遍历,等这条路走不通再回溯 设置要开始遍历的第一个顶点,然后寻找该顶点的第一个邻接顶点,如果第一个邻接顶点存在,则从第一个邻接顶点又重新开始深度优先,寻找它的第一个邻接顶点,直到他们的第一个邻接顶点不存在或者第一个邻接顶点已经被访问,那么寻找
阅读全文
摘要:使用邻接矩阵表示图详解 说明 图是一种可以实现多对多的数据结构,不像链表和树,他们只能建立一对一的关系,每个节点只有前驱或者后继节点,不能实现多对多 对于图的描述可以使用邻接矩阵或者邻接表 使用邻接矩阵描述图: 创建集合保存图的顶点 创建二维数组即矩阵描述顶点与顶点之间的关系,顶点与顶点之间用权值来
阅读全文
摘要:多路查找树 二叉树问题分析 二叉树在加载到内存时,如果二叉树的节点比较少,没有什么问题,但是如果二叉树的节点很多,就会出现问题 在构建二叉树时,需要多次进行IO操作,海量数据存储在数据库或者文件中,节点海量,构建二叉树时速度有影响 节点海量,也会构成二叉树的高度很大,会降低操作速度 多叉树 在二叉树
阅读全文
摘要:平衡二叉树(AVL)详解 说明 平衡二叉树又称平衡二叉排序树,是二叉排序树的一种特殊类型 平衡二叉树主要为了解决二叉搜索树出现的一些问题,比如如果二叉搜索树的各个节点的值是按照顺序的,那么二叉排序树的形式会形如单链表,但是它的查找速度会比单链表慢,因为二叉排序树在遍历时还要考虑左子树或者右子树,即使
阅读全文
摘要:二叉排序树删除节点详解 说明 二叉排序树有着比数组查找快,比链表增删快的优势,比较常见 二叉排序树要删除节点,首先要找到该节点和该节点对应的父节点,因为只根据当前节点是不能删除节点本身的,因此需要找到父节点 二叉排序树删除节点,根据节点所在的位置不同,需要分为三种情况 即要删除的节点是叶子节点,要删
阅读全文
摘要:二叉排序树创建详解 说明 二叉排序树是二叉树的一种,它的左子节点元素值总是小于父节点,右子节点值总是大于父节点 而且它各个节点之间通过引用连接,具有链表的灵活结构,因此增加和删除元素是非常快的,只需要判断当前要添加的值和叶子节点的大小关系,然后添加即可 也因为它的左右子节点值和父节点值的关系,使用二
阅读全文
摘要:赫夫曼编码之文件压缩与解压详解 说明 使用赫夫曼编码对文件进行压缩与解压,与对文本文件的操作是一样的,只是加入了IO流的相关操作 赫夫曼编码对于重复率较高的二进制文件压缩效率较高,但是如果二进制文件重复率不高,则基本没有压缩效率 注意使用赫夫曼压缩后的文件,必须使用赫夫曼再进行解压,其他解压工具不提
阅读全文
摘要:赫夫曼解码详解 说明 上篇已经说明赫夫曼编码,那么将一文件通过编码压缩后,需要再对其进行解压,就是将其还原为原来的文件 解码也就是编码的逆向操作,熟悉编码的操作流程后,解码相对简单 需要先将编码后的字符数组转成二进制字符串,具体思路及解析见方法 byteToBitString 拿到二进制字符串后,需
阅读全文