数据结构与算法 干货篇
文章平均质量分 85
学习数据结构与算法的总结的总结
机器灵魂注入师
一名在不断精进的嵌入式软件开发工程师,很庆幸能从事自己喜欢的工作。
愿你要永远抱有一颗好奇之心。
愿你出走半生,归来仍是少年。
展开
-
验证:为RT-Thread内核增加一种新的查找字节最低非0位的算法
人生最苦痛的是梦醒了无路可走。做梦的人是幸福的;倘没有看出可走的路,最要紧的是不要去惊醒他。– 鲁迅 《娜拉走后怎么样》概述该篇文章来源于:《验证:为RT-Thread内核增加一种新的查找字节最低非0位的算法》在 RT-Thread 的内核代码中,有一种查找最低非零位的算法,主要采用查表的方法,通过时间换空间的方式,为系统寻找线程的最高优先级提供了一种高效的方法。通过查看内核代码里面的 kservice.c 文件,我们可以看到如下源代码:const rt_uint8_t __lowest_.原创 2021-11-07 17:47:06 · 279 阅读 · 0 评论 -
一种新的高效的寻找字节最低非0位的有效算法
追逐梦想就是追逐自己的厄运,在满地都是六便士的街上,他抬起头看见了月光。毛姆 --《月亮与六便士》一、前言该文章见github仓库:https://github.com/Eureka1024/An-effective-method-for-finding-the-lowest-non-0bit-bit-of-byte本文目的是介绍一种新的查找字节最低非0位的算法,该算法比一般的位图算法更省空间,同时对于 32bit以及更长的字节,该算法查找字节最低非0位的实现路径也更加高效。该算法的原理为:假.原创 2021-09-13 23:28:47 · 1333 阅读 · 3 评论 -
位运算的一些常用技巧总结
number 和 number-1 上做 AND 位运算时,原数字 number 的最右边等于 1 的比特会被移除。注意:该算法发布在 1988 年 《C 语言编程第二版》的练习中(由 Brian W. Kernighan 和 Dennis M. Ritchie 编写),但是 Donald Knuth 在 2006 年 4 月 19 日指出,该方法第一次是由 Peter Wegner 在 1960 年的 CACM3 上出版。顺便说一句,可以在上述书籍中找到更多位操作的技巧。参考资料https:.原创 2021-04-13 20:34:59 · 184 阅读 · 0 评论 -
解决算法题的一些技巧和经验
方法论先解决问题,然后再去优化,或者别的复杂度更低的方法。比如,遇到一些题,可以先使用常规方法,比如暴力破解之类的笨办法,先保证实现,这样心态会更好一点,利于找到更优的方法。...原创 2021-04-01 23:51:48 · 1536 阅读 · 0 评论 -
数据结构与算法解析 -- “动态规划”篇
一、概述态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。不过,它也是出了名的难学。它的主要学习难点跟递归类似,那就是,求解问题的过程不太符合人类常规的思维方式。对于新手来说,要想入门确实不容易。不过,等你掌握了之后,你会发现,实际上并没有想象中那么难。为了让你更容易理解动态规划,我分了三节给你讲解。这三节分别是,初识动态规划、动态规划理论、动态规划实战。第一节,我会通过两个非常经典的动态规划问题模型,向你展示我们为什么需要动态规划,以及动态原创 2021-03-13 00:04:40 · 337 阅读 · 0 评论 -
数据结构与算法解析 -- “回溯算法”篇
一、概述深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。既然应用如此广泛,我们今天就来学习一下这个算法思想,看看它是如何指导我们解决问题的。如何理解“回溯算法”?在我们的一生中,会遇到很多重要的岔路口。在岔路口上,每个选择都原创 2021-03-12 19:04:24 · 276 阅读 · 0 评论 -
动态规划系列 之 股票相关问题 (C语言刷leetcode)
2020-10-15“知识的诅咒”:一旦我们知道某样东西,我们就会发现很难想象不知道它的时候会是什么样子。一、概述leetcode中的股票相关的题目如下:打开看很容易就知道是求最大收益,由于是求最值,很容易就想到要使用动态规划。其实动态规划就是使用了穷举,但是因为这类问题存在「重叠⼦问题」,可以使用DP table来优化穷举过程,记录过计算的结果,避免不必要的计算。动态规划三要素重叠⼦问题(如果暴力解决,存在大量运算,可以使用备忘录(DP table)来解决)最优⼦结构要符.原创 2020-10-15 23:50:18 · 1055 阅读 · 0 评论 -
基本排序算法代码实现汇总
一、冒泡排序这里直接使用的是优化的冒泡排序(增加一个标志位,当某个循环没有交换数据,说明已经排序完成,就判断结束)时间复杂度O(n*2)/* 交换L中数组r的下标为i和j的值 */void swap(SqList *L,int i,int j) { int temp=L->r[i]; L->r[i]=L->r[j]; L->r[j]=temp; ...原创 2020-02-04 19:19:39 · 250 阅读 · 0 评论 -
查找算法代码实现汇总
一、折半查找(二分查找)C语言实现如下:/**************************** 功能:折半查找(二分查找) * 输入:* a -- 数组(数据集查找表)* n -- 数据集大小* key -- 要查找的元素* 输出:* 查找的元素在数据集a中的位置***************************/int Binary_Search(int *...原创 2020-02-04 11:04:02 · 526 阅读 · 0 评论 -
数据结构与算法解析 -- “分治算法”篇
2020-6-28卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭。北岛 – 《回答》一、概述分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这.原创 2020-06-28 23:42:12 · 434 阅读 · 0 评论 -
数据结构与算法解析 -- “贪心算法”篇
2020-6-27有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人天不负,卧薪尝胆,三千越甲可吞吴。一、概述贪心算法,由名称就知道,每一步的决策都选择当前最优的方案(每一步的贪心),期望最后达成的结果是全局最优的方案。所以,贪心算法适于求解的场景:局部最优的累计会达到全局最优。贪心算法的最难的一块是如何将要解决的问题抽象成贪心算法模型,只要这一步搞定之后,贪心算法的编码一般都很简单。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生.原创 2020-06-27 16:12:01 · 1371 阅读 · 0 评论 -
数据结构与算法解析 -- “复杂度分析”篇
- 2020-6-11每一个不曾起舞的日子,都是对生命的辜负。——尼采一、概要数据结构和算法本身解决的是“快”和“省”的问题,也就是如何更省、更快地存储和处理数据的问题,因此,就需要一个考量效率和资源消耗的方法,那就是复杂度分析方法。复杂度分析分为时间复杂度和空间复杂度。为啥需要复杂度分析方法?代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小的方法称为事后统计法。但是其有几个弊端:测试结果非常依赖测试环境(比如使用的硬件设备的性能不同)。测试结果受数据规模的影响原创 2020-06-11 23:57:03 · 324 阅读 · 0 评论 -
数据结构与算法解析 -- “二分查找”篇
**2020-6-26 **人类唯一能从历史中吸取的教训就是,人类从来都不会从历史中吸取教训。德国哲学家 – 黑格尔一、概述二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。二分查找是一种非常.原创 2020-06-26 16:59:18 · 1245 阅读 · 0 评论 -
环形队列的实现与应用(C语言版)
2020-03-26To boldly go where no one has gone before.勇踏前人未至之境。场景需求我们经常会遇到各模块间运行速度不匹配的场景,如果不做特殊处理,可能会导致有些数据会丢失。使用队列作为中间缓冲,可以有效解决这个问题。举个例子,单片机有些串口发送的波特率设置的很低,可能会存在当一个字节正在发送中,突然又触发了新的发送,此时前面的数据未发...原创 2020-03-26 19:07:28 · 1346 阅读 · 2 评论 -
数据结构与算法解析 -- “排序”篇
一、概述排序算法中最经典的、最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。1.1、如何分析一个“排序算法”?学习排序算法,除了学习它的算法原理、代码实现之外,更重要的是要学会如何评价、分析一个排序算法。下面是衡量的几个方面。排序算法的执行效率最好情况、最坏情况、平均情况时间复杂度在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此之外,还要说出最好、最坏时间复杂度对应的要排序的原始数据是什么样的。为什么要区分这原创 2020-06-17 20:31:44 · 405 阅读 · 0 评论 -
数据结构与算法解析 -- “递归”篇
2020-6-16十步杀一人,千里不留行。事了拂衣去,深藏身与名。李白 – 《侠客行 》一、概述递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。去的过程叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。诸如f(n)=f(n-1)+1 其.原创 2020-06-16 22:56:41 · 469 阅读 · 1 评论 -
数据结构与算法解析 -- 队列篇
**2020-6-14 **重剑无锋,大巧不工。金庸 --《神雕侠侣》一、概述先进者先出,这就是典型的“队列”。队列跟栈非常相似,支持的操作也很有限,也是一种操作受限的线性表数据结构。最基本的操作也是两个:入队 enqueue()放一个数据到队列尾部;出队 dequeue()从队列头部取一个元素。二、队列的实现跟栈一样,队列可以用数组来实现,也可以用链表来实现。用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈。同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式.原创 2020-06-14 09:48:32 · 214 阅读 · 0 评论 -
桶排序、冒泡排序、快速排序对比
一、桶排序(简易版) 桶排序是一种比较简单的排序算法,排序速度极快,但是对空间要求很大,尤其是那种排序的数范围特别大的时候,所以桶排序更适于那种要排序的数处于比较小的范围的情况。算法详情见链接:桶排序算法。二、冒泡排序 冒泡排序,举个例子(从小到大排序),对n个数进行排序,则进行n-1的比较,第一趟从第一个开始,第一个与第二个比较,若第一个比第二个大,则交换位置,否则不改变,接着对第二...原创 2018-06-19 09:22:09 · 1625 阅读 · 1 评论 -
算法与数据结构解析 -- 细节总结篇
数据结构的存储⽅式只有两种:数组(顺序存储)和链表(链式存储)。数据结构种类很多,但它们存在的⽬的都是在不同的应⽤场景,尽可能⾼效地增删查改。各种数据结构的遍历 + 访问⽆⾮两种形式:线性的和⾮线性的。线性就是 for/while 迭代为代表,⾮线性就是递归为代表。前序遍历、中序遍历、后序遍历指的都是根节点。对于畏惧算法的朋友来说,可以先刷树的相关题⽬,试着从框架上看问题,⽽不要纠结于细节问题。...原创 2020-09-24 23:38:07 · 139 阅读 · 0 评论 -
算法与数据结构解析-- 系列文章汇总篇
算法与数据结构解析 系列文章目录数据结构与算法解析 – 数组篇原创 2020-09-24 23:49:25 · 250 阅读 · 0 评论 -
累加和校验算法(CheckSum算法)
因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。所以今天的校验说法,比较简单,但是有...原创 2018-11-08 20:35:56 · 71956 阅读 · 7 评论 -
一文详解循环冗余校验校验算法(CRC校验)及C语言代码的实现 ---- 以CRC-16/MODBUS为例讲解
一、概述现在的产品开发过程中,无论是数据的储存还是传输,都需要确保数据的准确性,所以就需要在数据帧后面附加一串校验码,方便接收方使用校验码校验接收到的数据是否是正确的。常用的校验方式有奇偶校验、异或校验、累加和校验(可以看我之前的一篇文章累加和校验算法(CheckSum算法))、循环冗余校验(CRC校验)等等。奇偶校验、异或校验、累加和校验都比较简单,且易于实现,但是检错能力也一般,而本文的主角CRC校验,则大大提高了数据的检错能力。(对比文章看这篇《奇偶校验 累加和校验 CRC校验》)讲CRC校验原创 2021-01-27 22:21:48 · 7983 阅读 · 0 评论 -
数据结构与算法解析 -- 栈篇
2020-6-13吾生也有涯而知也无涯,以有涯随无涯,殆矣。– 庄周《庄子·内篇·养生主》一、概述后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。但这种受限,也控制了出错的概率。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。二、栈的实现从栈的定义看,栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。如何用代码.原创 2020-06-13 21:36:52 · 526 阅读 · 0 评论 -
数据结构与算法解析 -- 链表篇
**2020-6-13 **从来如此,便对吗?– 鲁迅《狂人日记》一、概述链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域(对于双向链表也会存储上一个节点的地址域)。常见的三种链表结构:单链表双向链表循环链表双向循环链表二、链表的结构形式分析2.1、单链表链表.原创 2020-06-13 10:52:30 · 1670 阅读 · 0 评论 -
数据结构与算法解析 -- 数组篇
**2020-6-12 **黑夜给了我黑色的眼睛,我却用它寻找光明 。诗人顾城 --《一代人》一、概括数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。理解数组的几个关键点线性表(Linear List)线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简.原创 2020-06-12 23:57:13 · 812 阅读 · 1 评论