
数据结构与算法
文章平均质量分 80
笔记
Indifferent-
生活就是一半诗意,一半烟火,手执烟火以谋生,心怀诗意以谋爱。曾经一直觉得远方才是诗,经历了人间烟火,才发现,油盐酱醋茶,亦可成诗。
展开
-
C语言 平衡二叉搜索树(AVL树)
AVL树是一种自平衡的二叉搜索树,它在插入和删除操作后能够通过旋转操作来保持树的平衡。AVL树是由苏联数学家G.M. Adelson-Velsky和E.M. Landis于1962年提出的,其名称即来源于他们的姓氏的首字母。原创 2023-06-30 20:07:31 · 395 阅读 · 0 评论 -
《数据结构与算法》课程设计——哈希表设计
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有3000个,取平均查找长度的上限。原创 2023-06-22 10:31:28 · 1772 阅读 · 5 评论 -
C语言 基数排序
基数排序的时间复杂度取决于元素的位数和基数的大小。如果待排序序列有 n 个元素,d 代表最大元素的位数,k 表示基数的大小,则基数排序的时间复杂度为 O(d*(n+k))。基数排序通常适用于待排序元素的位数不是很大的情况下,且待排序元素需要满足一定的条件,例如整数类型。它相对于比较性排序算法,可以在某些情况下具有更好的性能。原创 2023-06-20 09:35:23 · 454 阅读 · 0 评论 -
C语言 归并排序
归并排序的时间复杂度为 O(nlogn),其中 n 是待排序数组的长度。它是一种稳定的排序算法,适用于对链表和数组等数据结构进行排序。原创 2023-06-20 08:47:00 · 164 阅读 · 1 评论 -
C语言 选择类排序(简单选择排序、堆排序)
简单选择排序和堆排序都是不稳定的排序算法。在简单选择排序中,每次选择最小(或最大)元素进行交换时,可能会改变相同元素之间的相对顺序,因此简单选择排序是一种不稳定的排序算法。在堆排序过程中,通过构建最大堆或最小堆来实现排序。在每一次交换堆顶元素和末尾元素的操作中,可能会打破相同元素的相对顺序,导致堆排序的结果不稳定。简单选择排序可用于链式储存结构,堆排序只能用于顺序结构。无论是选择排序、堆排序还是其他排序算法,选择合适的排序方法取决于具体的应用场景和需求。原创 2023-06-14 16:11:01 · 740 阅读 · 0 评论 -
C语言 交换类排序(冒泡排序、快速排序)
冒泡排序和快速排序都是非常基础的交换类排序算法。它们虽然在性能上存在着较大差别,但都有其独特的优缺点。冒泡排序 :代码简单易实现,稳定排序,适用于数据规模较小以及数据已经部分有序的情况下。但对于大规模乱序数据的排序,冒泡排序的性能表现相对较差。快速排序:具有较高的效率,但元素非顺次的移动导致排序方法是不稳定的,适用于处理大规模乱序数据,并且在实际应用中也被广泛使用。但最坏情况下的时间复杂度较高,并且需要额外的空间开销进行递归栈调用等操作。原创 2023-06-12 20:37:51 · 636 阅读 · 0 评论 -
C语言 插入类排序(直接插入排序、折半插入排序、希尔排序)
总体来说,插入类排序的时间复杂度都无法达到线性对数级别以下,但是它们具有实现简单、稳定性好等优点,在一些特定场景下还是被广泛使用的。同时,它们的空间复杂度虽然不同,但均在常数级别,因此很适合内存较小的设备上执行排序操作。原创 2023-06-12 16:36:34 · 831 阅读 · 0 评论 -
C语言 哈希查找(哈希表的创建、处理冲突、查找等)
哈希函数的构造方法、处理哈希冲突的方法以及哈希查找的实现。原创 2023-06-11 19:09:00 · 6681 阅读 · 6 评论 -
C语言 线性表的查找(顺序查找、折半查找)
顺序查找和折半查找作为查找问题中的基础算法,在各自适合的场景中具备着一定的优势和局限性。当数据规模较大时,折半查找的时间复杂度的表现更佳;而对于较小数据规模和无序数据,使用顺序查找可能是更好的选择。同时,我们还可以通过在二叉搜索树和哈希表等其他数据结构上应用查找技术来解决不同的查找问题。因此,我们在日常编程中,应该根据实际情况选择基于不同算法的查找策略,以获得更好的效率与体验。原创 2023-06-09 19:02:00 · 1969 阅读 · 0 评论 -
C语言 最小生成树 (Kruskal算法和Prim算法)
以上算法的实现,普里姆算法的时间复杂度为O(n^2),与网中边上无关,因此适用于求稠密网的最小生成树;克鲁斯卡尔算法时间复杂度为O(eloge),与网中边数有关,与普里姆算法相比,更适合求稀疏网的最小生成树。原创 2023-06-08 21:13:57 · 2994 阅读 · 4 评论 -
C语言 深度优先搜索和广度优先搜索
深度优先搜索是从一个节点开始,沿着一条路径一直走到底,如果走到了死路,就回退到上一个节点,再继续走其他路径,直到遍历完整个图。广度优先搜索是从一个节点开始,先访问这个节点的所有邻居节点,然后依次访问这些邻居节点的邻居节点,直到遍历完整个图。两者的主要区别在于搜索的顺序不同,深度优先搜索的搜索顺序是一条路走到黑,直到遇到死路才回退,而广度优先搜索的搜索顺序是逐层遍历,先遍历距离起始节点为1的节点,再遍历距离起始节点为2的节点,以此类推。原创 2023-06-02 11:11:24 · 3148 阅读 · 4 评论 -
C语言 关键路径(求解过程及算法实现)
在项目管理中,关键路径是一个非常重要的概念。通过计算关键路径可以确定项目最短完成时间,并对任务进行优先排序。同时,关键路径也能够帮助项目经理识别风险并采取相应的措施以确保项目能够按时完成。原创 2023-06-07 22:36:01 · 3693 阅读 · 1 评论 -
C语言 拓扑排序(Kahn算法和DFS算法实现)
Kahn算法和DFS算法都可以实现拓扑排序,二者均对顶点进行入度计数,但他们的实现方式不同,各有特点。Kahn算法使用栈或队列进行操作,实现过程简单且极易理解;而DFS算法则更加优美,同时也使用了栈的思想。然而,当面对大规模数据时,Kahn算法通常会更快一些。总之,两种算法都是在时间复杂度(n为顶点数,e为边数)的情况下解决任务调度问题、编译依赖等问题的简单有效方法。原创 2023-06-05 15:59:44 · 1659 阅读 · 0 评论 -
C语言 最短路径 弗洛伊德(Floyd)算法
弗洛伊德算法是一种解决图中多源最短路径问题的算法,可以求出图中任意两个节点之间的最短路径长度。该算法的时间复杂度为,空间复杂度为。需要指出的是,虽然弗洛伊德算法能够解决任意两个节点之间的最短路径问题,但在某些情况下可能不是最优解。因此,在实际使用中,需要根据具体需求选择合适的算法。总之,弗洛伊德算法作为图论领域中的经典算法,其思想和方法都值得我们深入学习和掌握,以便能够更好地应对实际问题。原创 2023-06-04 18:03:53 · 4811 阅读 · 0 评论 -
C语言 二叉搜索树(建立、插入、查找和删除等基本操作)
以上是关于二叉搜索树的一些基础知识和操作流程。二叉搜索树是一种常用的数据结构,在实际开发中应用广泛。它可以快速地实现数据的查找、插入和删除等操作,并且具有遍历操作,可以对 BST 中的数据进行排序。在工程实践中,二叉搜索树可以用于实现字典、关键字索引和数据压缩等场景。当然,BST 也有一些缺点,主要是在遇到极端情况时,比如树的深度很大,会出现退化,在某些操作上的时间复杂度会退化成 O(n),不再具有快速的操作效率。为了解决这个问题,需要进行 AVL 树或红黑树等平衡二叉搜索树的优化。原创 2023-06-03 18:05:20 · 3718 阅读 · 0 评论 -
C语言 最短路径 迪杰斯特拉(Dijkstra)算法
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。原创 2023-06-01 21:52:24 · 7332 阅读 · 0 评论 -
C语言 图的建立(邻接矩阵与邻接表)
5Cinfty。原创 2023-05-25 16:03:12 · 6147 阅读 · 1 评论 -
图的基本概念
图(Graph)G由两个集合V和E组成,记为G=(V,E),其中V是顶点的有穷非空集合,E是V中顶点偶对的有穷集合,这些顶点偶对称为边。V(G)和E(G)通常分别表示图G的顶点集合和边集合,E(G)可以为空集。若E(G)为空,则图G只有顶点而没有边。对于图G,若边集E(G)为有向边的集合,则称该图为有向图;若边集E(G)为无向边的集合,则称该图为无向图。在有向图中,顶点对是有序的,它称为从顶点x到顶点y的一条有向边。因此,与是不同的两条边。原创 2023-05-21 16:41:49 · 2049 阅读 · 1 评论 -
C语言 二叉树的遍历(前中后序递归与迭代遍历,层序迭代遍历)
如图所示二叉树 先序遍历结果为:1 2 4 5 3 6中序遍历结果为:4 2 5 1 6 3后序遍历结果为:4 5 2 6 3 1层序遍历结果为:1 2 3 4 5 6递归的实现就是每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。而迭代法遍历的原理就是模拟递归。 一、先序遍历 递归遍历 迭代遍历 二、中序遍历 迭代遍历原创 2023-05-08 23:30:40 · 4912 阅读 · 0 评论 -
C语言 生成一棵二叉树
递归生成一棵二叉树原创 2023-05-08 11:01:56 · 934 阅读 · 1 评论 -
C语言 队列(循环队列和链队初始化进出队等基本操作)
循环队列、链队的初始化、进队和出队等基本操作-----原创 2023-04-23 15:55:42 · 20872 阅读 · 4 评论 -
C语言 栈(顺序栈、链栈、共享栈)
栈初始化、进栈、出栈等基本操作算法实现。以上就是顺序栈、链式栈和共享栈,本文仅仅简单介绍了栈的基本操作,而栈的运用十分灵活。原创 2023-04-14 09:35:40 · 2614 阅读 · 3 评论 -
C语言 初识树和二叉树(二叉树的一些基本概念和性质)
树的定义、树的基本术语、二叉树的定义、二叉树的性质。原创 2023-04-21 09:53:50 · 190 阅读 · 0 评论