数据结构
数据结构学习记录
dfan0425
这个作者很懒,什么都没留下…
展开
-
哈夫曼编码之解压缩
上篇文章讲到了哈夫曼编码的压缩,但是只会压缩不会解压缩也没什么用。接下来就来说一说哈夫曼编码的解压缩。仍以下面这句话为例:“oh my god!oh my god! hey”;当我们获得压缩过的字节数组后,需要对该字节数组转换为2进制的字符串。即转换为: 110 001 01 1011 100 01 1110 110 1111 000 01110 001 01 1011 100 01 ...原创 2020-04-12 16:11:31 · 470 阅读 · 0 评论 -
哈夫曼编码之压缩
介绍哈夫曼编码是可变字长编码的一种,其是根据数据建立的哈夫曼树得来的。通过哈夫曼编码可以对数据进行压缩。图示1. 以下面这句话为例:“oh my god!oh my god! hey”,首先得出字符串中每个字符出现的次数,并以次数作为该字符的权重建立一个哈夫曼树。(这里不再赘述哈夫曼树的建立过程)然后我们可以得到每个字符对应的哈夫曼编码,并且每个编码都不是另一个编码的前缀(即...原创 2020-04-12 15:38:43 · 1851 阅读 · 0 评论 -
基数排序
基数排序思想基数排序是一个经典的空间换时间的排序算法。白话难表达,下面直接上图。图示这里按照 9, 153, 5, 3, 99, 72, 60, 111, 100, 10 该组数字为例进行说明,(从小到大)1. 定义10个桶,(程序里可以定义二维数组来表示)先将每个数字按照个位数字依次将数字放入桶中(个位数字是几便放在第几个桶中)2. 然后依次从左至右,...原创 2020-04-06 23:25:16 · 149 阅读 · 0 评论 -
排序之归并排序
归并排序思想归并排序利用了分治策略,即先将一组数字进行分组,分组之后在进行排序。下面是归并排序的图示(从小到大排序)图示图中说明了,归并排序是先将一组数进行分组,分到不可再分之后再进行排序,即需要采用递归实现。分组的规则是前一组中最后一个数字的下标为分组前数组的首尾下标之和除以2(结果不为整数时向下取整)。代码实现: /** * 传入要排序数组array、...原创 2020-04-06 18:01:35 · 157 阅读 · 0 评论 -
排序之快速排序
快速排序思想这里按照从小到大排序讲解,快速排序是把一组数字中的一个数作为中轴,然后把数组中的比中轴大的数都移动到中轴的右边,把比中轴小的数都移动到中轴的左边。当移动过后再将中轴两边的数字分别进行上述操作,直到最后无法再分便完成排序。其实该过程是一个递归的过程。图示这里以 3 6 4 2 5 1 3 这组数字为例,为了便于处理,约定每次都把最左边的数字作为中轴。1. 首先把最左边的3...原创 2020-04-06 16:25:56 · 260 阅读 · 0 评论 -
排序之希尔排序
希尔排序思想希尔排序对要排序的数字进行分组,在组内进行排序。排序完成需要进行多次分组,每次分组的个数是前一次分组个数的一半。图示以 [3290615487] 该数组为例从小到大进行排序。1. 首先将该组数字进行分组,首次分组的个数为数组长度除以2,即 10 / 2 = 5 组,下面相同颜色的为一组(即同一组内数字之间的下标的距离为组的个数)...原创 2020-04-05 16:04:54 · 585 阅读 · 0 评论 -
排序之插入排序
插入排序思想插入排序将要排序的一组数字分为两个部分,一部分为已排序部分,另一部分为未排序部分。其核心即是从未排序部分中拿出一个数插入到已排序部分,并要保证插入后该部分仍是有序的。然后重复插入直到未排序部分中所有的数字都被插入到已排序部分中,即排序完成。图示下面以 4 2 1 3 为例说明1. 将该组数字分为两个部分,已排序部分为绿色 ,未排序部分为红色并从未排序数字中拿出第一...原创 2020-04-05 14:41:42 · 105 阅读 · 0 评论 -
排序之选择排序
选择排序思想选择排序的核心就是在选择两个字上面,即给定一串数字,选择出最小的一个数字并把它放置最左边(这里的最左边是指还未进行排序的数字中的最左边),然后再选择一个剩下数字中最小的数字并放置在最左边,依次类推直至所有数字都排序完成。图示这里以 4 1 2 3 这组数字的第一轮排序为例说明。1. 将最小的数字挑选出来并放置最左边(要进行交换)4 1 2 3 → ...原创 2020-04-05 12:04:59 · 98 阅读 · 0 评论 -
排序之冒泡排序
冒泡排序思想冒泡排序之所以叫做冒泡,是因为在进行排序的过程中,(这里按照从小到大排序)从左至右将被排序的数字两两比较,大的数字将被交换至右边,直到最大的数字被交换至最右边。这里最大的数字是一点点被挪出来的,就相当于泡泡从水下慢慢浮上来。图示这里以 4 1 3 2 这组数字的第一轮排序为例说明。1. 先比较 4 和 1的大小,大的数字将被移至右边4 1 3 2 →...原创 2020-04-05 11:38:14 · 114 阅读 · 0 评论 -
后缀表达式及其计算方法
1.中缀表达式转后缀表达式在计算普通的四则运算时,比如 1+(2+3*4-5)+6 该表达式即为中缀表达式,但对于计算机来说采用中缀表达式计算并不友好。所以需要将中缀表达式转换为对于计算机而言更容易计算的后缀表达式。转换方法:1. 创建一个栈 s1 和一个列表 s2。2. 将中缀表达式从左至右依次遍历。(此后将遍历到的字符称为 s)3. 当栈 s1 为空时,直接将 s 压入栈。4. ...原创 2020-04-02 23:13:02 · 11498 阅读 · 2 评论 -
单链表反转之头插法
单链表反转之头插法头插法的思想:创建一个节点作为新的头节点。遍历整个单向链表,每遍历到一个结点便把该结点移至新的头结点的下一个结点,直到到遍历结束。将新的头节点再替换为源头结点。下面上代码: //单链表反转 public static void reverseLinkedList(SingleLinkedList list) { //若链表长度为0或者为1则直接返...原创 2020-03-31 23:43:20 · 1176 阅读 · 0 评论