刻意练习-编程
文章平均质量分 76
通过练习实际中的问题,编程达到知行合一的境界。
不问江湖任少侠
这个作者很懒,什么都没留下…
展开
-
刻意练习-哈夫曼编码简单压缩一个文件
一、文件是如何被压缩的?现在假设有这样一个文件,文件内容如下:damainnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnaaaaaaaaaaaaaaaaaaaaaaaaaayikunnnnnnnnnnnnnnnaaaaaaaaaa现在这个文件总共是100个字节现在文件里面的内容是一个字符占用一个字节(bytes),8个bit。如果我有办法能够用更少的bit来表示这个文件中的内容,就能够实现文件的压缩。**所以,我先放弃ascii 编码,使用原创 2021-07-24 10:27:48 · 274 阅读 · 0 评论 -
刻意练习-理解哈夫曼树构建哈夫曼表C语言
理解哈夫曼树构建哈夫曼表一、哈夫曼树的作用哈夫曼树是一个二叉树,是可以将一些字节重新编码 ,而且能够使用最少的空间。所以也叫最优二叉树。比如这段字符串damainnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnaaaaaaaaaaaaaaaaaaaaaaaaaayikunnnnnnnnnnnnnnnaaaaaaaaaa这是100个字节。但是如果你构造一个表如下:haffuman_map haffuman_table[]={ {'n',0b0}, {原创 2021-07-24 10:24:07 · 566 阅读 · 1 评论 -
刻意练习-堆排序C语言
一、堆排序先了解什么是堆。这里的堆,其实是一个完全二叉树。有两个性质大顶堆的父节点比子节点要大。小顶堆的父节点比子节点要小。父节点和子节点之间的关系是.父节点的下标是k,子节点就是2k+1/2k+2。假设要排序一个数组{1,2,4,3,5}按照层序遍历,则现在这个数组在数中的位置是:现在这个堆还不是一个大顶堆。所以要做如下调整。得到大顶堆之后,根节点就是整个堆上最最最大的元素。所以可以做如下操作:将最大的元素换到屁股后面,这样,最大的元素就找到了它的位置。然后原创 2021-07-07 21:41:50 · 157 阅读 · 4 评论 -
刻意练习-归并排序
一、归并排序和递归这篇已经使用递归实现快速排序。感觉也很爽。所以再实现一下归并排序让我更爽。递归先要弄清楚第N步和N-1步的关系。然后想明白终止条件。归并排序思想是什么样呢?比如我要排序 {2,1,8,7,4,3,6,5} 这个数列。我可以先把数列拆分成两部分,然后让这两部分分别有序。然后我们合并两个有序的数列,组成完整的有序数列。所以在这里,第N-1步就是两个数列已经各自有序了。第N步就是把这两个数列合并。 具体的N-1步如何有序,就看N-2步了,依次类推。直到数列只有一个原创 2021-06-29 17:23:17 · 92 阅读 · 0 评论 -
刻意练习-快速排序
一、递归和快速排序之前这篇已经使用递归解决汉诺塔问题,感觉十分的爽。所以趁热打铁练习一下快速排序。递归解决问题的关键是了解解决问题过程中N和N-1步的关系。并且假设N-1步已经完成了。快速排序刚好满足。快速排序思路简单如下:图可以看出。快速排序是不断的将数列,按照某个中间值为界限,将大的放在中间值右边,小的放在中间值左边。这张图是为了表达这个意思。实际上可能不是这样移动的。但是思想表达清楚了。这种套娃式的解决方法,使用递归是没毛病的。二、抽象我首先要找到那个原创 2021-06-29 15:41:17 · 110 阅读 · 0 评论 -
刻意练习-递归解决汉诺塔问题
一、递归和汉诺塔递归是要先找到解决问题的步骤,从第1步做什么,第2步做什么,一直推断到N-1步做什么,第N步做什么。然后把注意力放在第N-1步和第N步之间。并且假设N-1步已经解决OK了。比如求和1-100.如果使用递归来完成。int sum(int max_num){ //如果这个数值是0,就直接返回0. if(max_num == 0) { return 0; } //假设之前的求和已经OK了。我用当前值加上之前的和就行。原创 2021-06-26 12:49:29 · 455 阅读 · 0 评论 -
刻意练习-希尔排序
一、介绍希尔排序,是插入排序的改进版。是为了减少插入排序中对数值的移动次数。比如,这个数列需要插入一次就完成排序。但是这个序列就要插入好多次。如图,1,2,3,4,都要前移,而且都是最远距离。说明一个问题,插入排序在基本有序的情况下,做的插入操作更少,效率更高。 希尔排序就是为了让数列基本有序。希尔排序让每个值先跳着插,让整个数列基本有序。最后再调用插入排序。先跳5/2=2个插入:变成这样:此时已经是基本有序了。然后跳2/2=1个插,就是基本的插入排序。原创 2021-06-24 20:14:27 · 196 阅读 · 4 评论 -
刻意练习-插入排序
一、理解插入排序比如有一串数字,1,2,5,6,3,4 ,需要将这几个数字排序。插入排序指的是这样做而后将4取出。最终得到这个。二、抽象不建议直接从网上找个现成的程序背会。练习编程 就是锻炼自己抽象的能力。解析一下这张图,将3取出,放到5的前面。第一,要有一个数组,或者链表。以数组为例。你先要找到3这个 成员。(人脑可能一下就找到了,但是计算机要怎么找到,代码要怎么写?)第二,你要记录下这个成员的值。第三,你要找到插入的位置。第四、你原创 2021-06-22 20:16:15 · 137 阅读 · 1 评论