随笔分类 -  数据结构与算法分析——C语言

摘要:前面讲解了递归的基本概念,今天我们利用递归的基本思想来了解一下分治算法,分治算法递归的实现方式在大多数算法书籍上都有伪代码,而且网络上也有各种语言的实现版本。本文的主要目的是带大家理解为什么可以使用递归,为什么想到使用递归的方式来解决排序问题。 详情点击该处链接或关注公众号查看。 阅读全文
posted @ 2020-08-24 21:38 Crystal_Guang 阅读(447) 评论(0) 推荐(0) 编辑
摘要:在环形缓冲区中,我们还使用到了柔性数组。那么什么是柔性数组呢? 点击查看公众号文章详情: 阅读全文
posted @ 2020-06-01 17:56 Crystal_Guang 阅读(521) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2020-05-23 21:17 Crystal_Guang 阅读(1) 评论(0) 推荐(0) 编辑
摘要:环形缓冲区是一个常用的数据结构,熟练使用环形缓冲区可以加快日常工作中的项目进度。本文会实现一种可用于嵌入式单片机,也可以用于嵌入式Linux和PC软件端的环形缓冲区数据结构,看懂本文,无论你是写PC软件,还是嵌入式软件,即使是单片机,也可以将其应用在你的项目上。 ———这篇文章,可能是我见过和我所能 阅读全文
posted @ 2020-05-19 23:02 Crystal_Guang 阅读(1709) 评论(0) 推荐(0) 编辑
摘要:有了前面Linux内核复用实现栈的基础,使用相同的思想实现队列,也是非常简单的。普通单链表复用实现队列,总会在出队或入队的时候有一个O(n)复杂度的操作,大多数采用增加两个变量,一个head,一个tail来将O(n)降成O(1)。但是在内核链表中,天然的双向循环链表,复用实现队列,无论出队还是入队, 阅读全文
posted @ 2019-11-10 22:19 Crystal_Guang 阅读(1027) 评论(0) 推荐(0) 编辑
摘要:我们当然可以根据栈的特性,向实现链表一样实现栈。但是,如果能够复用已经经过实践证明的可靠数据结构来实现栈,不是可以更加高效吗? so,今天我们就复用Linux内核链表,实现栈这样的数据结构。 要实现的功能很简单,如下(项目中如需更多功能,可自行添加): 我们先来说,栈的创建: 非常简单,和内核链表一 阅读全文
posted @ 2019-10-20 22:29 Crystal_Guang 阅读(723) 评论(0) 推荐(2) 编辑
摘要:本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_eac 阅读全文
posted @ 2019-10-13 18:40 Crystal_Guang 阅读(34939) 评论(18) 推荐(14) 编辑
摘要:函数递归调用,本质还是依托于栈,栈具有后进先出的特点,可以很好的实现回溯。 八皇后问题是典型的运用回溯思为解决问题的例子。 code: 一共92种解法。 首先为八皇后自设定了边界,所以二维数组的大小为 [N+2] [N+2].然后直角坐标系以左上方开始。 判断皇后是否可以放置,即为三个方向的判断: 阅读全文
posted @ 2018-08-22 21:12 Crystal_Guang 阅读(528) 评论(0) 推荐(0) 编辑
摘要:递归是数学上数学归纳法的模型。 不要陷入递归的具体细节。 截取知乎上一个很棒的解释: 作者:知乎用户链接:https://www.zhihu.com/question/24385418/answer/258015386来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 递 阅读全文
posted @ 2018-08-21 11:36 Crystal_Guang 阅读(455) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2018-03-31 22:01 Crystal_Guang 阅读(9) 评论(0) 推荐(0) 编辑
摘要:栈的定义栈是一种特殊的线性表栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 栈的性质 栈的操作 栈的一些常用操作  创建栈  销毁栈  清空栈  进栈  出栈  获取栈顶元素  获取栈的大小 栈的顺序存储实现  顺序存储 阅读全文
posted @ 2018-03-09 16:15 Crystal_Guang 阅读(3313) 评论(0) 推荐(0) 编辑
摘要:单链表的局限  单链表的结点都只有一个指向下一个结点的指针 单链表的数据元素无法直接访问其前驱元素 单链表的改进 双向链表的定义在单链表的结点中增加一个指向其前驱的pre指针 双向链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到 阅读全文
posted @ 2017-07-31 17:22 Crystal_Guang 阅读(380) 评论(0) 推荐(0) 编辑
摘要:单链表的局限 有些线性关系是循环的,即没有队尾元素 一年12个月,是重复的,12月过了又要回到1月,对于这样的线性元素规律,前人给我指明了一条更好的道路:循环链表。 循环链表拥有单链表的所有操作  创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 阅读全文
posted @ 2017-07-27 11:06 Crystal_Guang 阅读(943) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-07-26 16:20 Crystal_Guang 阅读(5) 评论(0) 推荐(0) 编辑
摘要:这一课最后实现的链表,和普通链表不同,借鉴了linux内核链表的思想,这也是企业使用的链表。 基础介绍: 顺序表的思考 顺序表的最大问题是插入和删除需要移动大量的元素!如何解决?A:在线性表数据元素之间空出位置,为以后插入使用。B:这样不行!中间无论空多少都有可能用完!A:那不是无解了嘛!B:我觉得 阅读全文
posted @ 2017-07-19 16:17 Crystal_Guang 阅读(553) 评论(0) 推荐(0) 编辑
摘要:顺序存储结构 在C语言中可以用一维数组来实现顺序存储结构  获取元素操作  判断线性表是否合法  判断位置是否合法  直接通过数组下标的方式获取元素 插入元素算法  判断线性表是否合法  判断插入位置是否合法  把最后一个元素到插入位置的元素后移一个位置  将新元素插入  线性表长 阅读全文
posted @ 2017-07-14 20:56 Crystal_Guang 阅读(514) 评论(0) 推荐(0) 编辑
摘要:线性表的讨论 线性表的操作  线性表的一些常用操作  创建线性表  销毁线性表  清空线性表  将元素插入线性表  将元素从线性表中删除  获取线性表中某个位置的元素  获取线性表的长度 先把方法声明出来,下一节课开始实现: 小结 阅读全文
posted @ 2017-07-13 20:32 Crystal_Guang 阅读(226) 评论(0) 推荐(0) 编辑
摘要:线性表的定义  线性表(List)是零个或多个数据元素的集合 线性表中的数据元素之间是有顺序的 线性表中的数据元素个数是有限的 线性表中的数据元素的类型必须相同 线性表的性质 性质  a0为线性表的第一个元素,只有一个后继  an为线性表的最后一个元素,只有一个前驱  除a0和an外 阅读全文
posted @ 2017-07-13 10:51 Crystal_Guang 阅读(328) 评论(0) 推荐(0) 编辑
摘要:算法效率的度量 事后统计法  比较不同算法对同一组输入数据的运行处理时间 缺陷  为了获得不同算法的运行时间必须编写相应程序  运行时间严重依赖硬件以及运行时的环境因素  算法的测试数据的选取相当困难事后统计法虽然直观,但是实施困难且缺陷多,一般不予考虑。 程序效率估算练习二重循环估算 阅读全文
posted @ 2017-07-12 10:11 Crystal_Guang 阅读(400) 评论(0) 推荐(0) 编辑
摘要:程序效率越高越好,并不是越短越好。在某些场合下,我们需要写出别人看不懂的算法最好,但是在一个团队开发中,算法可读性应该尽可能高。 算法的定义 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列算法是独立存在的一种解决问题的方法和思想。对于算法而言,语言并不重要,重要的是思想 算法的特性 阅读全文
posted @ 2017-07-11 10:30 Crystal_Guang 阅读(635) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示