随笔分类 -  数据结构与算法

摘要:赫夫曼编码详解 说明 赫夫曼编码是基于赫夫曼树的一种文件压缩算法,常用于文件的编码,压缩效率较高 本文主要基于赫夫曼编码说明,对于赫夫曼树见前一篇 大致思路如下: 因为任何类型的文件在计算机底层存储的时候都是以字符的形式存储的,因此文件的压缩主要是对字符的优化处理 先创建节点类,应当包含当前字符,权 阅读全文
posted @ 2021-06-08 17:20 mx_info 阅读(444) 评论(0) 推荐(0)
摘要:创建赫夫曼树详解 说明 赫夫曼树又称哈夫曼树,是指带权路径长度(WPL)最小的一颗二叉树 带权路径长度等于该数的所有叶子节点的权值 * 该叶子节点所在树的路径长度 创建一颗赫夫曼树,指的是将一个数组中的所有元素全部当作二叉树的叶子节点,然后计算WPL,wpl最小的二叉树,也就是最优二叉树,称为赫夫曼 阅读全文
posted @ 2021-06-07 22:49 mx_info 阅读(453) 评论(0) 推荐(0)
摘要:堆排序详解 说明 堆排序基于堆的特性,速度较快,效率较高,平均时间复杂度为线性对数阶 先说明大顶堆和小顶堆 大顶堆是指当前二叉树的父节点对应的值总是大于子节点对应的值,及arr[i] >= arr[ 2 * i + 1] 并且arr[i] >= arr[ 2 * i + 2]总成立,不论是根节点还是 阅读全文
posted @ 2021-06-07 10:47 mx_info 阅读(174) 评论(0) 推荐(0)
摘要:二叉树线索化遍历 说明 二叉树在线索化之后,不能使用之前的前序中序后续遍历方法,因为将一些叶子节点连通后,可能出现循环递归 因此需要编写新的线索化遍历方法 以中序线索化遍历为例 先根据中序线索化后的前驱节点类型寻找中序遍历的第一个节点,它的前驱接节点类型为 1 ,找到第一个前驱节点后,依次判断当前节 阅读全文
posted @ 2021-06-06 22:50 mx_info 阅读(390) 评论(0) 推荐(0)
摘要:线索化二叉树详解 说明 线索化二叉树,由字面意思,就是将二叉树的节点拿线索连接起来 实质上,也就是将二叉树的叶子节点左右指针域彼此连接一个节点 二叉树的非叶子节点的左右指针域都各自连接了一个节点,但是叶子节点的左右指针域是空的,因此考虑将叶子节点的左右指针域按照某种遍历次序连接起来 按照二叉树的遍历 阅读全文
posted @ 2021-06-06 21:45 mx_info 阅读(923) 评论(0) 推荐(0)
摘要:顺序存储二叉树详解 说明 顺序存储二叉树,即将一颗完全二叉树按照从上到下,从左到右的顺序存储到一个数组中,因为数组是顺序存储的结构,因此称为顺序存储二叉树 给二叉树中各节点用 n 编号,从零开始,一直到最后 一个节点,对应于数组位置 假设当前节点的编号为 n ,那么当前节点的左子节点编号为 2 * 阅读全文
posted @ 2021-06-06 17:07 mx_info 阅读(473) 评论(0) 推荐(0)
摘要:二叉树删除节点详解 说明 二叉树删除节点,如果删除的是叶子节点,则找到后直接删除,如果是非叶子节点,则删除该子树 因为没有针对某种特定的二叉树,因此没有考虑如果是非叶子节点,只删除该节点的情况 删除节点思路 先判断该二叉树是否为空,如果不为空,则判断该二叉树的根节点是不是需要删除的节点,如果是,则直 阅读全文
posted @ 2021-06-06 11:51 mx_info 阅读(1338) 评论(0) 推荐(1)
摘要:二叉树前序中序后续查找详解 说明 二叉树前序中序后续查找和遍历思路完全类似,查找完全是在遍历的基础上,只不过如果找到想要查找的节点,则直接返回 前序查找是先判断要查找的节点是不是当前节点,如果是,则直接返回,如果不是,则判断当前节点的左子树是否为空,如果不为空,则递归前序查找,如果左子树查找完毕后还 阅读全文
posted @ 2021-06-05 21:11 mx_info 阅读(342) 评论(0) 推荐(0)
摘要:二叉树前序中序后续遍历详解 说明 二叉树前序中序后续遍历的主要不同在于父节点的输出顺序 前序遍历是先输出父节点,然后判断左子树是否为空,如果不为空,则递归前序遍历,然后再判断右子树是否为空,如果不为空,则递归前序遍历 中序遍历实现判断当前节点的左子树是否为空,如果不为空,则递归中序遍历,然后再输出当 阅读全文
posted @ 2021-06-05 17:37 mx_info 阅读(269) 评论(0) 推荐(0)
摘要:哈希表详解 哈希表说明 哈希表,又称为散列表,通过关键码值来存储数据,具有很高的查询效率 哈希表的核心思想是数组里边存储链表 哈希表一般用作数据的缓冲层,因为它的快速高效及结构特性 通过向员工系统中添加员工模拟哈希表思路分析 先创建一个员工类,实例化对象为一个实际存在的员工,类似于链表的节点 然后创 阅读全文
posted @ 2021-06-04 21:36 mx_info 阅读(261) 评论(0) 推荐(0)
摘要:斐波那契查找算法详解 说明 斐波那契查找算法核心思想类似于二分查找和插值查找,区别在于对标志值,即 mid 的设计算法不一样,二分查找直接重用中间值作为标杆,插值查找使用自适应确定mid,而斐波那契查找算法则使用黄金分割,使得mid总是处于查找数列的黄金分割点位置 因为斐波那契数列越到后边,相邻两数 阅读全文
posted @ 2021-06-04 17:56 mx_info 阅读(1145) 评论(0) 推荐(0)
摘要:插值查找算法详解 说明 插值查找算法是二分查找算法的升级版,即优化算法,如果要查找的数组中有大量的数据,而要查找的数是第一个或者最后一个,那么二分查找也要耗费一定的时间,原因在于对Mid值的确定每次都是在中间,为了解决这个问题,对二分查找进行优化 插值查找思路与二分查找思路相同,都是使用递归的思想, 阅读全文
posted @ 2021-06-04 11:42 mx_info 阅读(492) 评论(0) 推荐(0)
摘要:二分查找之查找数组中相同的多个元素详解 思路分析 如果数组中有多个相同的元素,而正好要查找这些元素的下标,则应该以集合的形式返回 二分查找的整体思路不变,还是使用递归查找,若没有找到则返回空集合 但是当找到一个要查找的元素时,不能直接返回,而是向左或者向右扫描,判断找到的这个元素左侧或者右侧元素也是 阅读全文
posted @ 2021-06-03 22:34 mx_info 阅读(1092) 评论(0) 推荐(0)
摘要:二分查找详解 思路分析 二分查找是经常使用的一种查找算法,查找速度快,只需要O(log n)时间复杂度 但是二分查找要求原始数组是有序的,即要么升序,要么降序 使用递归的思路,考虑递归结束的条件,即要么找到该元素,要么查找完数组还没有找到该元素,都结束递归 源码及详解见下 源码及分析 /** * 二 阅读全文
posted @ 2021-06-03 21:57 mx_info 阅读(72) 评论(0) 推荐(0)
摘要:线性查找详解 说明 线性查找是最简单的查找算法,即遍历一次数组,将要查找的元素和数组中的所有元素一一比对 如果找到该元素,则返回该元素对应的索引,否则返回-1表示没有找到 线性查找不要求数组是有序的,但是遍历数组耗时较多 一般情况下不建议使用 源码 /** * 线性查找 * 如果在数组中找到该值,则 阅读全文
posted @ 2021-06-03 17:14 mx_info 阅读(142) 评论(0) 推荐(0)
摘要:基数排序详解 思路分析 基数排序是典型的以空间换时间的排序算法,但是当对大量数据进行排序时,可能会出现空间不足的情况 基数排序实质上是对桶排序的升级,核心思想是对数组中的每个元素从低位到高位开始排序,在较小数据高位补零,使数组中个元素长度相同 因此需要大量空间,即创建十个桶用来辅助排序,用二维数组来 阅读全文
posted @ 2021-06-03 16:48 mx_info 阅读(177) 评论(0) 推荐(0)
摘要:归并排序详解 说明 归并排序使用分治的思想,分治是将一个复杂的问题拆结尾简单的问题,然后使用递归的思路求解 归并实质上是将数组中的元素先二分,第一次从中间分成两部分,然后对这两部分再二分,依次进行,直到分成的每组只有一个元素,如果只有一个元素,那么就一定能保证这组元素是有序的,分解结束后,将分解后的 阅读全文
posted @ 2021-06-02 16:02 mx_info 阅读(102) 评论(0) 推荐(0)
摘要:快速排序详解 说明 快速排序是对冒泡排序的一种升级,因此排序速度非常快,典型的以空间换时间的思路 先从数组中找一个中间值,这个值的找法有设计者自己定义,可以是数组最中间的值,也可以是数组的最前边或者最后边的值,一般选择中间值 找到这个标志值后,将左侧大于这个标志值的数移动到这个值右侧,将右侧小于标志 阅读全文
posted @ 2021-06-01 22:00 mx_info 阅读(105) 评论(0) 推荐(0)
摘要:希尔排序详解 说明 希尔排序是对插入排序的一种升级算法,补足的插入排序的缺点,即如果最小的数字在最末尾,那么插入排序就要交换元素 len - 1次才能将最小元素移动到最前边 希尔排序也称缩小增量排序,核心思想就是不断的缩小增量,第一次增量缩小为数组元素长度的一半,第二次再缩小一半,以此类推,直到增量 阅读全文
posted @ 2021-06-01 20:39 mx_info 阅读(581) 评论(0) 推荐(0)
摘要:插入排序详解 思路分析 插入排序即 将要插入的数寻找合适的位置插入 将一个要插入的数组分成两部分,一个有序表和一个无序表,然后将无序表中的每一个数插入到有序表中 在插入过程中,先寻找要插入的位置,然后插入 刚开始有序表可以认为是数组的第一个元素,无序表可以认为是数组中剩下的元素,然后依次插入,有序表 阅读全文
posted @ 2021-05-31 16:38 mx_info 阅读(200) 评论(0) 推荐(0)