
数据结构与算法
文章平均质量分 58
tyst08
这个作者很懒,什么都没留下…
展开
-
CDT规约之CRC8校验
CDT规约中校验码的计算是用的CRC校验。CRC(Cyclic Redundancy Check)即循环冗余校验码,是一种很常用的校验码。它有很强的检错、纠错能力,并且实现编码和检码的电路比较简单,常用于串行传送中。CRC的编码思想是将要传送的n位信息位表示成一个报文多项式M(X),用M(X)除以一个预先约定的生成多项式G(x),得到的余式就是所需的循环冗余校验码。M(X)最高幂次是(n-1)。G(x)是一个(k+1)位的二进制数,最高幂次是k。M(X)左移k位后,除以G(x),会得到k位余数,就是校原创 2021-09-10 21:17:46 · 1418 阅读 · 0 评论 -
LeetCode全局变量问题 - 由构造二叉树发现的
LeetCode全局变量问题 - 由构造二叉树发现的今天有小伙伴(好基友)问了我一个问题,他在LeetCode刷到一道题,碰到一个问题一直没想通,也不知道怎么解决,于是过来让我一起看。为了说清楚这个问题,我们先看题目:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 /原创 2020-06-11 18:40:06 · 2755 阅读 · 2 评论 -
动态规划
动态规划动态规划是运筹学的一个分支,是一种求解多阶段决策过程最优化问题的数学方法。要搞清楚它,首先需要搞清楚几个基本概念。阶段:整个决策过程可以按某个(空间、时间或其它)标准分为多个步骤,每一步称为一个阶段。比如下棋,走一步就可以认为是一个阶段。状态:状态表示在每个阶段我们关注的决策相关的影响因素的情况。比如下棋到某一步时,此刻棋盘上所有棋子的位置就是此阶段的状态。状态通常可以用一个或多个变量来描述。决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择行动方法称为决策。比如下棋到原创 2020-05-28 19:57:19 · 604 阅读 · 0 评论 -
排序算法-11-桶排序
桶排序前面介绍的计数排序、基数排序是两种线性时间(即时间复杂度为 O(n)O(n)O(n))的排序算法,这一篇介绍另外一种也是线性时间的排序方法:桶排序。原理桶排序的前提是要排序的元素呈均匀分布。其原理是先将要排序的元素分到有限数量的桶里,然后对每个桶里的元素分别排序,最后再按顺序输出。步骤如下:设置一定数量的空桶。把每个元素放到对应的桶去。因为是均匀分布,所以每个桶的元素数量都差不多。对每个不是空的桶进行桶内排序。桶内排序可以采用别的排序算法,如插入排序、计数排序等,可以根据实际情况需要进行原创 2020-05-17 11:55:59 · 551 阅读 · 0 评论 -
靠谱:保证实时的动态内存分配
五一在家没有出门,研究了一下 TLSF 动态内存分配算法。缘起要说清楚TLSF,得从动态内存分配开始说起。动态内存分配是所有系统中都要考虑的问题,我们从学C语言开始就知道用的malloc函数就是用来申请动态内存的。其基本原理就是malloc时系统从堆中拿出一块内存分配给你用,用完之后通过free再还回去。这个过程有点像借钱,比如最近疫情手头紧,没钱吃饭了,于是找朋友malloc点钱去吃饭,比...原创 2020-05-01 20:26:14 · 1150 阅读 · 2 评论 -
排序算法-10-基数排序
基数排序前面介绍的计数排序是一种线性时间(即时间复杂度为 O(n)O(n)O(n))的排序算法,这一篇介绍另外一种也是线性时间的排序方法:基数排序。原理基数排序最早是用于打孔卡片制表机上的算法,它可以给打孔的卡片进行排序。我们把打孔改为用数字表示,则它的基本思想是将整数按位数依次排序。步骤如下:统一数据长度为相同的位数,数位较短的数前面补零。按照个位数进行排序。按照十位数进行排序。...原创 2020-05-01 12:00:47 · 406 阅读 · 0 评论 -
排序算法-9-计数排序
计数排序前面已经介绍过的所有排序,包括插入排序、选择排序、冒泡排序、归并排序、鸡尾酒排序、希尔排序、快速排序和堆排序都是比较排序,因为在他们的排序过程中,都需要经过比较,比较元素的大小然后调整顺序。可以证明,在最坏情况下,任何比较排序都需要经过 Ω(nlogn)\Omega(n \log n)Ω(nlogn) 次比较,所以比较排序的时间复杂度最好也就能到 O(nlogn)O(n \log n...原创 2020-04-25 11:44:11 · 233 阅读 · 0 评论 -
排序算法-8-堆排序
堆排序堆排序是利用堆(Heap)来进行排序的一种方法,在堆排序中,我们需要引入一种叫做“堆”的数据结构。堆一般可以看做是一棵完全二叉树,且堆中某个节点的值总是不大于或不小于其父节点的值,前者我们称之为最大堆,后者称之为最小堆。原理堆排序的思想是先用所有元素建立一个最大堆,然后每次取出最大的那个元素,并把剩下的元素再次调整为一个最大堆,如此循环。步骤如下:用所有元素建立一个最大堆。取出...原创 2020-04-08 22:26:54 · 431 阅读 · 0 评论 -
排序算法-7-快速排序
快速排序前面讲了插入排序、选择排序、冒泡排序、归并排序以及冒泡排序的改进版鸡尾酒排序和插入排序的改进版希尔排序,下面来说一种很常用的排序方法:快速排序。快速排序既然敢以快速命名,可以想见它的排序速度是很快的。事实也是如此,在实际应用中它的平均性能非常好,因此在一般情况下属于应用中的首选排序方式。原理快速排序与归并排序一样用了分治的思想。把一个要排序的数组按某个元素值(一般称作主元)进行划分...原创 2020-04-06 22:07:26 · 691 阅读 · 0 评论 -
排序算法-6-希尔排序
希尔排序(Shell Sort)希尔排序是对插入排序的一种优化。对插入排序不熟悉的同学可以参考插入排序一文。原理插入排序中每次比较之后只能将数据挨着移动一位,因此效率并不高。但是插入排序对于几乎已经排好序的数据操作时,效率是很高的。希尔排序的思想就是针对这两点做了优化,使每一次比较之后元素可以跨过多个数据移动,从而提高了整体效率。优化方式是对要排序的元素进行分组,然后在每个分组内进行插入排序...原创 2020-04-05 17:12:24 · 542 阅读 · 0 评论 -
排序算法-5-鸡尾酒排序
鸡尾酒排序其实就是双向冒泡排序,它是冒泡排序的一种变形。 冒泡排序是不断往一个方法冒泡,鸡尾酒排序则是先向一个方向,然后向另一个方向,来回冒泡。 不多废话了,直接上代码:/* cocktail_sort * Principle: bidirection bubble sort. * swap the biggest element to the last,原创 2014-05-20 18:48:57 · 1008 阅读 · 0 评论 -
排序算法-3-冒泡排序
冒泡排序是一种相当流行的容易想到的排序算法。它的原理是通过不断交换相邻的两个元素让小的元素越来越靠前,大的元素越来越靠后,就像轻的气泡往上浮一样。 要注意它与选择排序的区别,两者都会在内循环中把最小的元素找出来,但冒泡是通过不断交换相邻的元素,而选择是选出最小的然后跟最前面的交换;冒泡一次内循环之后除了找出来最小的元素以外,后面的元素也有可能变化,会消除一些逆序,而选择不会改变除了最小元原创 2014-01-02 21:17:44 · 718 阅读 · 0 评论 -
排序算法-4-归并排序
归并排序,是用分治法的一个典型的例子。把一个数组分成两个,分别排序那两个子数组,然后归并成一个数组,其技巧在于归并的过程。用代码实现如下:#include #include #define SIZE_ARRAY_1 5#define SIZE_ARRAY_2 6#define SIZE_ARRAY_3 20void merge_sort(int a[], int p, in原创 2013-12-17 21:49:16 · 535 阅读 · 0 评论 -
排序算法-2-选择排序
继续说排序。 这次说一个选择排序,也是非常容易想到的排序方法:每次选出最小的一个,放在最前面,然后在剩下的里面再选一个最小的,放在第二位,如此下去直到剩最后一个为止。用代码实现如下:#include #include #define SIZE_ARRAY_1 5#define SIZE_ARRAY_2 6#define SIZE_ARRAY_3 20void se原创 2013-12-11 22:33:15 · 669 阅读 · 0 评论 -
排序算法-1-插入排序
排序毫无疑问是算法中最基本的问题,插入排序更是其中常用的一种类型。 插入排序的思路非常容易理解,就像打扑克牌时一张一张摸牌,然后把牌从小到大排列在手里。手里的牌总是排好序的,每摸一张牌,就从大到小去比较,直到找到合适的位置把摸到的牌放进去。用代码实现如下:#include #include #define SIZE_ARRAY_1 5#define SIZE_ARRAY原创 2013-12-03 21:35:42 · 642 阅读 · 0 评论 -
重温数据结构和算法
大学就学过数据结构和算法,然而一晃毕业多年,虽然一直做软件方面的工作,却很少用到算法,偶尔用到也是网上搜索一下完事,没有深钻。如今越来越觉得思维退化,反应下降,于是开始思索这个问题。 Pascal之父Nicklaus Wirth在多年前就提出了:程序=算法+数据结构。可见作为一名程序员,对算法和数据结构的理解和掌握应该是必备的内功心法之一。现在编程语言越来越高级,封装越来越好,程序员的进原创 2013-07-27 16:40:15 · 571 阅读 · 0 评论 -
最大的子序列和问题
最大的子序列和问题是一个很经典的问题,各种考试面试中也经常碰到。这问题的解决不难,关键是通过这个问题体会一些算法的思路,学习思考怎么解决问题。 问题是这样的:给定整数A1,A2,...,An(正负不限),Ai,...,Aj(1 最直接也最容易想到的办法(当然也就是最暴力的方法),就是求出所有子序列的和,然后找出最大的。按照这个思路写出的C++代码如下:int Method1原创 2013-07-29 21:42:22 · 589 阅读 · 0 评论