- 博客(212)
- 收藏
- 关注
原创 data.biancheng.net数据结构网站
网站上有一整套的数据结构和算法教程,是 C 语言版本的,整套教程通俗易懂,不学院派,内容全面详尽,提供了完整、可运行的 C 语言程序,非常适合有 C 语言基础、对数据结构感兴趣的读者。感兴趣的小伙伴可以访问。
2024-01-17 17:35:14 379
原创 数据结构和算法教程(C语言版)
数据结构研究的是数据之间的关系,再进一步说,它研究的是多份数据之间的分布、排列和勾连的关系,以及在此基础之上如何进行高效的增删改查操作。数据结构是计算机专业的基础课程,也是所有程序员的内功心法;不懂数据结构就是写代码的农民,了解数据结构才能成为行业专家。六年创作,三次迭代,千般打磨,成就了现在这套精品的数据结构和算法教程。为了降低阅读门槛,本教程所有代码都基于C语言编写。
2023-11-04 14:20:52 868
转载 算法是什么,算法简介(小白必读)
算法(Algorism)一词最初出现在 12 世纪,是用于表示十进制算术运算的规则。18 世纪,算法 Algorism 演变为 Algorithm,算法概念有了更广的含义。任何定义明确的计算步骤都可称为算法,或者说算法是合乎逻辑、简捷的一系列步骤。现在算法通常指可以用计算机来解决某一类问题的程序或步骤。
2024-03-25 20:46:09 3
转载 数据结构是什么
从具体问题抽象出一个适当的数学模型;设计或选择一个解此数学模型的算法;最后编写出程序进行调试、测试,直至得到最终的解答。由于早期计算机所涉及的运算对象是简单的整型、实型或布尔类型数据,程序设计者的精力主要集中于程序设计的技巧上,无须重视数据结构。随着计算机应用领域的扩大和软、硬件技术的发展,非数值计算问题显得越来越重要。
2024-03-22 21:51:49 7
原创 数据结构与算法学习攻略(领思维导图)
数据结构和算法是两个独立的学科,数据结构研究的是数据的存储问题,而算法研究是的解决问题的方法(思路)。解决实际问题,既需要用到数据结构的知识,也需要用到算法知识,数据结构和算法经常放在一起讲解。最后给大家推荐一套我原创的数据结构和算法教程(网址是 xiexuewu.github.io),教程在讲解数据结构的过程中,也会讲解一些关联紧密的算法,并提供了完整、可运行的 C 语言程序,让每位读者都能学有所用,用有所成。
2024-03-06 21:00:35 366
原创 数据结构知识点总结(超级详细)
逻辑结构描述的数据之间的关系;物理结构描述的是数据的内存中真实的存储状态。存储逻辑关系为 “一对一” 的数据,存取数据必须遵循 “先进后出” 的原则。存储逻辑关系为“一对一”的数据,存取数据必须遵循 “先进先出” 的原则。如果数据中存储大量无效的元素,可以采用压缩存储的方式。算法研究的是解决问题的方法。只对查找表做查找和读取元素的操作,不改变查找表的存储结构。二叉树的先序遍历算法(递归和非递归)二叉树的中序遍历算法(递归和非递归)二叉树的后序遍历算法(递归和非递归)图的十字链表存储结构(C语言实现)
2024-03-01 15:27:27 859
原创 数据结构知识点汇总(超级详细)
数据结构究竟有哪些知识点需要学习呢?为了方便大家更直观地看到所有知识点,我制作了一张数据结构的思维导图,罗列了几乎数据结构所有的知识点。学习数据结构,就是学习数据的各种存储方案,包括线性表、栈和队列、串、数组和广义表、树和图。每个知识点都提供了对应的讲解文章,大家哪个知识点不懂,直接找相应的文章去看。
2024-03-01 14:10:42 454
原创 数据结构难学吗,有哪些好的学习资料?
语言,掌握熟练了,就可以开始学习数据结构和算法了。很多人觉得数据结构难学,是因为没有找到合适的书籍或者视频。客观地讲,很多书籍和视频都不适合初学者,它们讲知识喜欢拽学术名词,语言佶屈聱牙,初学者拿搬砖敲自己的脑袋都理解不了,它们更适合有一定数据结构基础的人。大部分人学不会编程,学不会数据结构,问题的关键出在选用的教程上。换句话说,学不会数据结构,往往不是我们有多笨,而是教材太垃圾,没有把知识讲明白。接下来,给大家推荐几套适合初学者的数据结构教程,既有文字教程,也有视频教程。
2024-02-21 20:33:48 875
原创 怎么才能学会数据结构?
初学者学习数据结构,最紧要的是熟练掌握一门编程语言,比如 C/C++ 语言。其次,很多人觉得数据结构难学,是因为没有找到合适的书籍或者视频。客观地讲,很多书籍和视频都不适合初学者,它们讲知识喜欢拽学术名词,语言佶屈聱牙,初学者拿搬砖敲自己的脑袋都理解不了,它们更适合有一定数据结构基础的人。大部分人学不会编程,学不会数据结构,问题的关键都出在选用的教程上。接下来,给大家推荐几套适合初学者的数据结构教程,既有文字教程,也有视频教程。
2024-02-20 20:19:22 866
原创 教小白玩转链表(长篇神文)
如果你掌握了 C 语言,正在学习数据结构中的线性表,那么这篇文章非常适合你,认真看完这篇文章,你就能玩转线性表。在这篇文章里,我将讲述以下几个问题: 线性表是什么 顺序表是什么 顺序表的基本操作 链表是什么 链表的基本操作 静态链表是什么 静态链表的基本操作 双向链表是什么 双向链表基本操作 循环链表 双向循环链表是什么 结合自己近 8 年对数据结构的研究,我原创了一整套数据结构和算法教程,它通
2024-01-25 21:20:57 860
原创 花10分钟彻底弄懂数据结构(小白必读)
如果你已经掌握了一门编程语言,马上要开始学习数据结构,或者已经学了一部分数据结构,但学得云里雾里,那么推荐你看完这篇文章,它能加深你对数据结构的认知,帮助你快速入门数据结构。接下来,我就结合这几个问题,给大家展开讲讲数据结构。结合自己近 8 年对数据结构的研究,我原创了一整套数据结构和算法教程,它通俗易懂、不学院派,没有晦涩难懂的学术用语,教程提供了完整、可运行的 C 语言程序,非常适合有 C 语言基础、想系统学习数据结构和算法的人。数据结构和算法教程(C语言版)
2024-01-25 20:01:59 1285
原创 动态规划算法
动态规划算法解决问题的过程和分治算法类似,也是先将问题拆分成多个简单的小问题,通过逐一解决这些小问题找到整个问题的答案。不同之处在于,分治算法拆分出的小问题之间是相互独立的,而动态规划算法拆分出的小问题之间相互关联,例如要想解决问题 A,必须先解决问题 B 和 C。》一节中,给大家举过一个例子,假设有 1、7、10 这 3 种面值的纸币,每种纸币使用的数量不限,要求用尽可能少的纸币拼凑出的总面值为 15。
2024-01-10 10:49:13 899
原创 稳定排序算法有哪些?
相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 "稳定" 的,有些是 "不稳定" 的。给定的待排序序列中,经常会包含相同的元素,例如:3 142此序列中包含两个元素 2,为了区分它们,我们分别称它们为 "红 2" 和 "绿 2"。评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序列中红 2 和绿 2 的相对位置是:红 2 位于绿 2 的左侧,或者说绿 2 位于红 2 的右侧。
2024-01-10 10:11:50 432
原创 内部排序算法的总结
所有的排序算法中单就平均时间性能上分析,快速排序算法最佳,其运行所需的时间最短,但其在最坏的情况下的时间性能不如堆排序和归并排序;本章所介绍的大多数算法都是在顺序存储结构的基础上实现的,基于顺序存储结构的局限性,排序算法在排序过程都需要进行大量记录的移动,影响算法本身的效率。通过比较所有的排序算法,没有哪一种是绝对最优的,在使用时需要根据不同的实际情况适当选择合适的排序算法,甚至可以考虑将多种排序算法结合起来使用。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往。
2024-01-04 17:14:55 357
原创 基数排序算法详解(C语言实现)
基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。例如对无序表进行基数排序,由于每个关键字都是整数数值,且其中的最大值由个位、十位和百位构成,每个数位上的数字从 0 到 9,首先将各个关键字按照其个位数字的不同进行分配分配表如下图所示:。在该序列表的基础上,再按照各关键字的十位对各关键字进行分配,得到的分配表如下图所示:。
2024-01-04 17:14:05 376
原创 归并排序算法(C语言实现)
归并排序算法的时间复杂度为O(nlogn)。该算法相比于堆排序和快速排序,其主要的优点是:当记录表中含有值相同的记录时,排序前和排序后在表中的相对位置不会改变。例如,在记录表中记录 a 在记录 b 的前面(记录 a 和 b 的关键字的值相等),使用归并排序之后记录 a 还在记录 b 的前面。这就体现出了该排序算法的稳定性。而堆排序和快速排序都是不稳定的。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624。
2024-01-04 17:12:46 317
原创 快速排序算法(C语言实现)
快速排序算法的时间复杂度为O(nlogn),是所有时间复杂度相同的排序方法中性能最好的排序算法。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-04 17:11:28 825
原创 希尔排序算法(C语言实现)
在使用直接插入排序算法时,如果表中的记录只有个别的是无序的,多数保持有序,这种情况下算法的效率也会比较高;希尔排序的过程中,对于分割的每个子表,其各自包含的记录在原表中并不是相互挨着的,而是相互之间相隔着某个固定的常数。通过此种方式,对于关键字的值较小的记录,其前移的过程不是一步一步的,而是跳跃性的前移,并且在最后一次对整表进行插入排序时减少了比较和排序的次数。希尔排序,又称“缩小增量排序”,也是插入排序的一种,但是同前面几种排序算法比较来看,希尔排序在时间效率上有很大的改进。
2024-01-04 17:09:23 359
原创 表插入排序算法(C语言实现)
前面章节中所介绍到的三种插入排序算法,其基本结构都采用数组的形式进行存储,因而无法避免排序过程中产生的数据移动的问题。如果想要从根本上解决只能改变数据的存储结构,改用链表存储。表插入排序,即使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更改结点间指针的指向。在使用数组结构表示的链表中,设定数组下标为 0 的结点作为链表的表头结点,并令其关键字取最大整数。
2024-01-04 17:07:25 721
原创 2路插入排序算法详解(C语言实现)
具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加到其右侧;2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。2-路插入排序相比于折半插入排序,只是减少了移动记录的次数,没有根本上避免,所以其时间复杂度仍为。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往。
2024-01-04 17:05:06 339
原创 哈希查找算法(C语言实现)
上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作。在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该关键字对应的数据的哈希地址,如果该地址中没有数据,则证明该查找表中没有存储该数据,查找失败:如果哈希地址中有数据,就需要做进一步的证明(排除冲突的影响),找到该数据对应的关键字同 K 进行比对,如果相等,则查找成功;
2024-01-04 17:00:40 797
原创 键树查找法(双链树和字典树)C语言实现
双链树和字典树是键树的两种表示方法,各有各的特点,具体使用哪种方式表示键树,需要根据实际情况而定。例如,若键树中结点的孩子结点较多,则使用字典树较双链树更为合适。
2024-01-04 16:59:32 830
原创 B+树是什么
有 n 棵子树的结点中含有 n 个关键字;在上一节中,在 B-树中的每个结点关键字个数 n 的取值范围为⌈m/2⌉≤n≤m。所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。所有的非终端结点(非叶子结点)可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。例如,图 1 中所示的就是一棵深度为 4 的 3 阶 B+树:图 1 3阶B+树。
2024-01-04 16:57:25 823
原创 B-树是什么
树中每个结点至多有 m 棵子树;若根结点不是叶子结点,则至少有两棵子树;除根之外的所有非终端结点至少有 ⌈m/2⌉ 棵子树;所有的非终端结点中包含下列信息数据:(n,A0,K1,A1,K2,A2,…,Kn,An);。Ki (i 从 1 到 n)为关键字,且 Ki < Ki+1;Ai 代表指向子树根结点的指针,且指针 Ai-1 所指的子树中所有结点的关键字都小于 Ki,An 所指子树中所有的结点的关键字都大于 Kn。图 1 结点结构。
2024-01-04 16:54:35 769
原创 红黑树(C语言实现)
本节介绍的红黑树,虽隶属于二叉查找树,但是二叉查找树的时间复杂度会受到其树深度的影响,而红黑树可以保证在最坏情况下的时间复杂度仍为O(lgn)。当数据量多到一定程度时,使用红黑树比二叉查找树的效率要高。同平衡二叉树相比较,红黑树没有像平衡二叉树对平衡性要求的那么苛刻,虽然两者的时间复杂度相同,但是红黑树在实际测算中的速度要更胜一筹!提示:平衡二叉树的时间复杂度是O(logn),红黑树的时间复杂度为O(lgn)
2024-01-04 16:33:28 793
原创 静态树表查找算法(C语言实现)
静态树表查找算法只适用于有序查找表,首先将有序表转换成一棵静态树表(二叉树),后续的查找操作都在静态树表上完成。当有序表中的元素查找概率不同时,可以使用二分查找算法,但静态树表查找算法的性能更高。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-04 16:28:13 784
原创 分块查找算法(C语言实现)
分块查找又称索引顺序查找,是一种在顺序查找算法基础上改进得到的算法。在索引顺序结构表示的静态查找表中,可以借助分块查找算法在表中查找特定的元素。索引顺序结构是一种顺序表和索引表的组合存储结构,例如:图 1 索引顺序结构数据全部存储在顺序表中,存储时遵循“分块有序”的规则。图 1 中的整个顺序表被分成了 3 块(用不同的颜色区分),第二块的所有元素都比第一块的大,同样第三块的所有元素都比第二块的大。根据各个块内的元素最大值,所有块有序存放在顺序表中,这样的存储方式就称为分块有序。
2024-01-03 20:00:55 768
原创 移动迷宫游戏(最短路径算法)
在上一章的移动迷宫小游戏中,我们用回溯法帮骑士在迷宫中找到了通往出口的一条通路,但是骑士并不满意,他又提出了更高的需求。《移动迷宫》升级版游戏简介:迷宫只有一个入口和一个出口,骑士从入口走进迷宫,现在需要你找一条通往出口最短的路线,将行走路线告诉骑士。
2024-01-03 19:59:16 965
原创 Floyd算法(弗洛伊德算法)详解
Floyd算法(弗洛伊德算法)专门用来查找带权图中各个顶点之间的最短路径,算法的时间复杂度可以用O()表示。如果想查找某个顶点到其它顶点之间的最短路径,虽然Floyd算法也能解决,但更推荐使用Dijkstra迪杰斯特拉算法,后者的时间复杂度为O()。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-03 19:56:49 814
原创 Dijkstra算法(迪杰斯特拉算法)详解
Dijkstra算法(迪杰斯特拉算法)可以在给定网(带权图)中查找一个顶点到其它顶点的最短路径,算法的时间复杂度为O(n2)。如果需要查找网中任意两个顶点之间的最短路径,虽然Dijkstra算法也能解决(对每个顶点都执行一次Dijkstra算法),但更建议使用Floyd弗洛伊德算法。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-03 19:54:31 773
原创 关键路径(C语言实现)
实际场景中,对于某项工程中的各个任务以及完成它们的先后次序,我们经常用有向无环网(带权的有向无环图)来表示。图 1 有向无环图图 1 就是一张有向无环网,整张网表示一项工程,顶点 V1~V9 表示工程中的各个任务;弧 a1~a11 表示执行各个任务的先后次序,各个弧的权值表示完成各个任务所需要的时间。类似上面这样,当我们用有向无环网描述某项工程时,数据结构中称这样的网结构为 AOE(Activity On Edge)网,网中的顶点称为“事件”,弧称为“活动”,弧对应的权值代表活动持续的时间。
2024-01-03 19:51:34 844
原创 拓扑排序算法(C语言实现)
拓扑排序算法只适用于有向无环图,这里给大家举一个反例,下图是一个有环图:图 7 有环图在有环图中,任意一个顶点的入度都不为 0,拓扑排序算法无法将环中的顶点全部添加到线性序列中,最终得到的序列就不是正确的拓扑序列。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-03 19:49:11 768
原创 重连通图是什么(通俗易懂)
连通图中,如果任意两个顶点之间都存在不止一条通路,这样的图就称为重连通图。举个简单的例子:图 1 重连通图图 1 不仅是连通图,还是重连通图,因为图中各个顶点之间存在不止一条通路,比如顶点 2 和 3 之间的通路有 2-3、2-5-3、2-1-3 等。在重连通图中,删除某个顶点(包括连接该顶点的边)后并不会破坏整个图的连通性。例如删除图 1 中的顶点 3,图的连通性并不会被破坏。
2024-01-03 19:46:47 780
原创 Kruskal算法(克鲁斯卡尔算法)详解
Kruskal 算法求最小生成树的过程,是从权值最小的边开始,选择 N-1(N 为连通图的顶点数)条边构成最小生成树。kruskal 算法更适合在边数较少的连通网中查找最小生成树。如果边的数量较多,建议选择Prim(普里姆)算法查找最小生成树。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-03 19:43:41 1036
原创 Prim算法(普里姆算法)
O()。由此可以断定,普里姆算法的运行效率只与连通网中包含的顶点数有关,而和连通网含有的边数无关。在边稠密的连通网中查找最小生成树,可以优先考虑 Prim 普里姆算法。如果连通网中所含边的绸密度不高,则建议使用克鲁斯卡尔算法。当前阅读的是整套数据结构和算法教程中的一节内容,想系统学习数据结构和算法的读者,可以前往教程目录页面系统的学习,加我 q(834937624)获取教程的完整 PDF 电子版。
2024-01-03 19:40:58 766
原创 广度优先生成树和森林(C语言实现)
我们知道,遍历连通图可以得到一棵生成树,遍历非连通图可以得到多棵生成树(又称生成森林)。关于生成树和生成森林,读者可以猛击《》做系统的了解。所谓广度优先生成树,指的就是用广度优先搜索算法遍历连通图得到的生成树。同样的道理,用广度优先搜索算法遍历非连通图得到的生成森林又称广度优先生成森林。那么,对于给定的一张(非)连通图,如何获得它对应的广度优先生成树(森林)呢?
2024-01-03 19:36:54 922
原创 深度优先生成树和森林(C语言实现)
我们知道,遍历连通图可以得到一棵生成树,遍历非连通图可以得到多棵生成树(又称生成森林)。关于生成树和生成森林,读者可以猛击《》做系统的了解。所谓深度优先生成树,指的就是用深度优先搜索算法遍历连通图得到的生成树。同样的道理,用深度优先搜索算法遍历非连通图得到的生成森林又称深度优先生成森林。那么,对于给定的一张(非)连通图,如何获得它对应的深度优先生成树(森林)呢?
2024-01-03 19:34:02 822
双向链表实现贪吃蛇游戏(C语言版)
2023-12-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人