自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(159)
  • 收藏
  • 关注

原创 第六章——分枝限界法

分枝限界法和回溯法一样,也是一种在问题的解空间树上搜可行解的穷举算法。其中“分枝”指的是“分枝限界法”搜索可行解采用的策略为广度优先搜索或实现方法和思路类似的代价优先搜索。广度优先搜索的概念和实现前面已经介绍过很多次了,这里不再做赘述;代价优先搜索的目的是以某种定义下的优先级,按照优先级从高到低的顺序处理所有的结点。(从低到高和从高到低本质上是一样的,这里以从高到低为例)。如果状态结点能够按照优先级不严格(可以相等)降低的顺序,在解空间树上按照结点高度从高到低,同高度结点从左到右或从右到左的排列,那我们可以

2022-06-09 10:02:39 1773 2

原创 第五章——回溯法

对于回溯法的概念,我们需要先从回溯法在实际解决问题中的表现来理解。书上称:回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现不满足求解条件时,就“回溯”(即回退),然后尝试别的可能。就我个人的角度而言,我不认为回溯法是一个类似于穷举的方法,而是针对于一些通过穷举法求解的问题:问题求解过程中的各个可能出现的状态作为结点,通过决策将两两结点连边构成一棵有向树,存在一个或多个我们想要求解的目标状态。为了得到我们的目标状态(或者是初始状态到目标状态的路径),我们采取深度优先遍历的策

2022-06-05 20:01:15 1309

原创 第四章——蛮力法

蛮力法概述蛮力法也称穷举法(枚举法)或暴力法,是一种简单的直接解决问题的方法,通常根据问题的描述和所涉及的概念定义,对问题所有可能的状态(结果)一一进行测试,直到找到解或将全部可能的状态都测试一遍为止。蛮力法的“力”指的是计算机的运算能力,蛮力法是基于计算机运算速度快的特性,减少人的思考而把工作都交给计算机的“懒惰”策略(这里的懒惰指的是人懒,不是算法中的懒惰方法),一般而言是最容易实现的方法。蛮力法的优点如下:1.逻辑简单清晰,根据逻辑编写的程序简单清晰。2.对于一些需要高正确性的重要问题,它产

2022-05-31 00:04:13 7335 1

原创 第三章——分治法

分治法概述分治法的设计思想分治算法的设计思想是将一个规模较大的问题分解成若干个规模较小的问题分开解决,然后将规模较小的问题的解合并成规模较大的问题的解,分解的过程我们称为“分”,求解和合并解的过程我们称为“治”。乍一看这不就是前面递归算法的一种特殊情况么?事实上分治法确实属于递归算法一类,比起一般的递归算法它有以下的特性:1.该问题可以分解为若干个规模较小的相似问题,且当规模缩小到一定的程度就可以容易地解决,即递归出口的诞生是自然的。2.该问题所分解出的各个子问题是相互之间独立的,即子问题之间不包

2022-05-25 15:48:50 1581

原创 第二章——递归

递归的定义,递归算法,递归模型在数学和计算机科学中,递归是指在在一个过程或函数的定义时出现调用本过程或本函数的成分。若在函数中调用函数自身或者在过程的子部分中调用子部分自身的内容,称之为直接递归,又称自递归。若不同的函数和子过程之间互相调用,则称之为间接递归,任何间接递归都可以等价地转换为直接递归(自递归)。如果一个递归过程或递归函数中,递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。一个有趣且经典的介绍递归的例子如下:递归的定义:请查阅“递归的定义”。这个例子不仅很好的体现了递归的特

2022-05-21 22:58:17 2882

原创 第一章——STL

STL概述说到STL我们往往认为它是基于模板的,实现了很多数据结构及对应操作的容器库。从概念上像上面理解一样理解没有问题,从库的内部结构来看,STL主要由container(容器),algorithm(算法)和iterator(迭代器)三大部分构成。STL容器容器就是指给你在库的内部已经实现好,可以让你直接调用的基于模板的数据结构类型,常用的数据结构和相对应的头文件如下:数据结构说明实现头文件向量(vector)连续存储元素容器,底层数据结构为数组,支持快速随机访问

2022-05-12 14:59:30 296

原创 第一章——算法分析

算法分析第一章节算法的概念和特性,我们了解到算法除了普通程序需要满足的基本性质另外想要满足的性质有:正确性,高效率和低储存量需求,健壮性,可读性和可使用性。其中健壮性,可读性和可使用性可以通过我们不断地完善我们的代码和注释来进行提升。算法分析准确来说分析的是算法的正确性,效率和储存量需求。算法的正确性可以通过数学方法证明和数据集验证的方法去处理。我们这里的算法分析是分析算法占用计算机资源的情况,计算机资源主要包括时间和内存空间,所以算法分析的两个主要方面是分析算法的运行时间和占用内存情况。运行时间和

2022-05-10 23:27:36 1319

原创 第一章——算法

算法的概念和特性算法分析与设计这门课从字面意思上可以分为三个模块——算法,分析,设计,其中分析和设计是具体进行时的“手段”,算法则是对象,所以我们首先需要知道算法是什么?算法(Algorithm)是求解一系列问题的清晰指令(计算步骤),是指解题方案的准确而完整的描述。算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,将输入数据转换成输出结果。这个概念并不抽象,说简单点就是可以用清晰数学语言描述的解决问题的方法就是算法。算法显然不是凭空出现的,于是就有了根据问题设计算法的概

2022-05-08 13:43:47 534

原创 第一章——计算机系统概论

1.1 计算机的分类电子模拟计算机和电子数字计算机电子计算机从总体上分为,电子模拟计算机和电子数字计算机两类。电子模拟计算机:“模拟”就是相似的意思。模拟计算机的特点是数值(数据)由连续量,也就是电压来表示,就像计算尺用长度表示数值,时钟用表盘表示数值一样。控制方式是在电压盘上连线(物理式),计算方式为电压组合和测量值,运算过程也是连续的。电子数字计算机,它是在算盘的基础上发展起来的,是用数字0和1来表示数量的大小(数据)。数字计算机的主要特点是按位(二进制类)运算,并且不连续地(离散地)跳动计算。

2022-05-04 14:43:10 1638

原创 Lecture 24-25

绪论最后三章的内容联系前面的贪心算法主要介绍几类算法(问题,思想),这一章节介绍动态规划。和贪心一样,动态规划不是某个算法,而是一种解决问题的思路,我们在前面介绍过的算法(例如Bellman-ford算法)中就有很多用到这个算法思想的。事实上在重新讨论了贪心算法的整体思路后,我觉得应该按照介绍最短路算法那里的顺序介绍贪心和动态规划(先介绍动态规划再介绍贪心)。Dynamic programmingDynamic programming,也就是我们常说的DP,就是指动态规划,那什么叫做动态规划呢?

2022-04-26 14:08:16 1177

原创 Lecture 18

绪论图的部分自最短路算法的三类算法介绍完毕之后就告一段落了,我们往回看Lecture 18。Lecture 18介绍的是算法思想中重要的一种思想——贪心思想,我当时认为先把图论部分的知识点介绍完全再介绍其他的知识点比较好,但是这个思想在Prim算法,Dijkstra算法(甚至于A*算法)等都有用到,不过课件上对贪心算法的概念介绍的不多,例子又比较抽象(没有直接体现出一个阶段到另一个阶段的扩展),再学习完上述的算法之后体会贪心思想我觉得也是很好的(个人觉得)。Definition关于贪心算法首先我们要

2022-04-23 16:19:25 623

原创 Lecture 23

绪论前面我们介绍了解决单源结点最短路径问题的算法——Bellman-ford算法和Dijkstra算法,解决单个结点到单个结点最短路径问题的算法——A*算法。但如果我们需要求大量的单个结点到单个结点的最短路径,并且起点和终点并不集中于某一个结点,进行|V|次的Dijkstra算法或Bellman-ford算法和进行|V|2次的A*算法(这种方法的效率不如Floyd算法存疑)在稠密图(O(|E|)=O(|V|2))中的复杂度逼近O(|V|3log|V|)。我们这一章节介绍的Floyd算法能够在O(|V|

2022-04-20 15:46:25 748

原创 Lecture 22

绪论前一章节,我们介绍了两种求解单源结点到其他所有结点最短路径(单源最短路径问题)的算法。但如果只是需要求解某一个结点到另一个结点的最短路径(或者求解少量的最短路径对),求解出单个结点到其他所有结点的最短路径就显得不那么必要(效率略低),我们需要设计出更适用于求解某一个结点到另一个结点最短路径的算法。BFS显然是求解某一个结点到另一个结点最短路径的一种算法,这一章节介绍的A*算法则是在静态网络中求解最短路径最有效(?)的直接搜索方法。Background && Idea课件里对A*

2022-04-20 00:26:55 707 3

原创 Lecture 21

绪论前几章节我们介绍了图中的一系列知识点——基础术语(有向,无向,边,顶点,度)和存储方式(邻接矩阵,邻接表),遍历结点的方式(宽度优先遍历和深度优先遍历),拓扑排序(我个人觉得应该将拓扑排序看作图遍历的一种方法)。这一章节我们讨论结点之间不同要求,不同情况下求最优路径的方式。BFS作为一种求单源结点到单源结点最短路径的方式,在其他情况求解最优路径的表现并不适用,同时对于求解单源结点到单源结点最短路径,也有在BFS的基础上优化的更好的算法。Shortest Path这里讨论的最优路径都是最短路径,

2022-04-15 01:42:46 744

原创 交通异常判断

绪论就是第一次项目结束的感想和代码。我负责的是对xml的读写已经数据的处理,由于C++xml读写的宝在我们编译器的环境发生了冲突,我自己写了一种xml读写的方式,判断的整体逻辑还是比较简单的,就是比较繁琐,还有调参的问题。代码#include<cstdlib> #include<iostream>#include<vector>#include<fstream>#include<cassert>#include<string

2022-04-07 14:37:50 155

原创 Lecture 20

绪论我们前面介绍了图的遍历和最小生成树,这一章节介绍图中的另一个重要知识点——拓扑排序。有关拓扑排序,我们不应该仅限于了解拓扑排序的算法,还应该了解拓扑排序的背景(为了解决什么样的问题),拓扑排序有关的数学(图论)知识,算法的运行过程,算法的运行时,拓扑排序另外的应用。第十八章应该是贪心算法,但我个人认为应该先把图上的知识点先介绍完全,所以将顺序调换了一下。Motivation拓扑排序起源于现实中的工程(活动)问题:假设存在若干个工程(活动)希望完成,但是某些工程需要在另外一些工程完成的基础上才能

2022-04-03 15:44:31 639

原创 Lecture 17-2

绪论上一章节介绍了图的遍历,这一章节开始介绍图中生成树,最小生成树的概念以及生成最小生成树的算法。Definition and Application首先还是要知道问题和算法涉及概念的定义是什么?Spanning Trees生成树从概念上来看其实一个合成词——一个图的生成(导出)子图中满足树状结构的图称为该图的生成树,例如下图中红色边组成的部分就是该图的生成树:Minimum Spanning Trees很显然生成树的情况不唯一,那么最小生成树的最小指的是什么最小呢?由于生成树的点集和原图

2022-03-26 00:20:45 758

原创 Fibonacci Heaps

绪论Fibonacci Heaps和Complete Heaps一样都是优化版本的堆。Complete Heaps是通过完全二叉树的简单性质来避免堆出现糟糕的退化情况,实际上在一般(最优)情况下各操作的复杂度和一般堆是一样的。Fibonacci Heaps的优化结合了lazy操作(懒惰标记),散列的一些思想和Fibonacci数的数学性质,在树的结构上不要求一昧的维持平衡(可能也维持了,只是我没有理解),在操作上可以将union(合并),insert(插入),decrease-key(修改某个元素的ke

2022-03-24 13:48:54 1948

原创 Lecture 17-1

绪论上一章节我们介绍了图的基本概念和存储方式,后面的章节对图论中简单的操作和算法依次进行介绍,首先要介绍的即是图的遍历,以及遍历的衍生应用。Graph Traversal图的遍历和树的遍历一样就是将所有的结点全部检查一遍,同样分为可以用递归和栈实现的基于深度的遍历和用队列实现的基于广度的遍历。区别在于,树状结构中结点到结点的路径都是唯一的,也就是说在搜索的过程中不会出现重复搜索的情况,而图中两个节点之间的路径很有可能不唯一,为了在不同分支避免重复搜索的情况,需要额外给每个结点定义一个哈希表或基于

2022-03-13 20:46:09 1099

原创 Lecture 16-1

绪论10-15章节我们介绍了数据结构中重要的一部分——树的概念和一些较为重要的应用。从Lecture 16,我们开始介绍数据结构重要的另外一个部分——图。事实上,从图论的角度来看,树应该是隶属于图这部分知识的一个重要部分,树是特殊的一类图。但从很多功能的实现来看,由于树有根节点到各个结点的路径唯一和无环的性质,同样的功能在树结构实现起来可以看作图结构的简化,我个人觉得这是在介绍图的问题之前先介绍树的原因。16-1主要还是介绍图的基本概念·······介绍了好几遍了。Undirected Graph

2022-03-11 22:44:42 409

原创 Lecture 15.2

绪论我们前面介绍了树,二叉树,特殊二叉树,堆系列,哈夫曼编码,BST系列,课件上将并查集作为树的最后一个章节进行介绍。事实上并查集比起前面的BST系列,在实现和优化方面都要简单很多,但是在使用方面反而更加灵活,往往可以用来解决一些意料之外的图论问题。Definition首先我们需要知道并查集用来描述什么样的概念?...

2022-03-09 21:18:06 365

原创 Lecture 15.1

绪论AVL树是BST往平衡方向的一种优化,红黑树是BST往平衡方向的另一种优化。相较于AVL树对每个结点的平衡因子或者高度严格地调整和修改,红黑树对BST的优化相对宽松和简单,或者说更接近于平衡的本质。关键在于我们如何去定义,从哪个角度来定义平衡二叉树的平衡。ps:百度,哎幕哟法泽,哎幕哟法泽,百度。The idea behind a red-black tree红黑树对于BST的优化和AVL树一样,都是从平衡这个方向进行优化。我个人觉得,我们在直接学习红黑树的定义,即红黑树在BST基础上的优化之

2022-03-07 20:30:39 261

原创 Lecture 14

绪论AVL,嘿嘿,我的AVL······AVL TreesAVL树对于BST的优化,就相当于“Complete Heap”对于Heap为了保证左右子树“平衡”的优化,AVL树的定义在BST的定义上需要同一个根节点左右子树的height之差不大于1。例如下面的这棵AVL树,所有左右子树的高度之差都不大于1。Height of an AVL Tree根据AVL树的定义和前面有关“Complete Heaps”的结论,所有基于完全二叉树的BST都是AVL树,所以高度为h的AVL树所包含的结点个数

2022-03-02 16:44:20 224

原创 Lecture 13-2

绪论介绍完堆,哈夫曼编码之后,BST它来咯hhhh。(我以为他会开一个单章而不是作为Lecture 13的后半部分介绍的,毕竟比起哈夫曼树,我觉得BST和堆的联系还稍微大一点)。Definition之前在介绍堆的时候,有提到过堆对标的是BST。堆的定义是对于所有的分支节点,子节点的值大于根结点的值(为了说明方便这里用数值来代替优先级),BST的定义是对于所有的分支节点,左子节点的值小于根结点的值小于右子节点的值。从定义上来看,BST左右子节点与父节点的关系比堆结构左右子节点与父节点的关系更加复杂

2022-02-28 22:28:36 169

原创 Lecture 13-1

绪论Lecture 10介绍的是树状数据结构,内容包括了两种存储结构——孩子链存储结构,孩子兄弟链存储结构,以及两种遍历方式。Lecture 11介绍了树中最为重要的一个分支二叉树以及将基于孩子兄弟链存储结构的树和森林转化成二叉树的方法。Lecture 12介绍了一种重要的特殊二叉树——堆,以及基于完全二叉树的一种优化方案——“Complete Heap”。"Complete Heap"的一种重要应用就是优先队列,Lecture 13介绍的就是基于优先队列实现的一种重要算法——Huffman cod

2022-02-24 15:39:41 254

原创 Lecture 12

绪论这一章节以上一章节介绍的二叉树为基础,介绍了一种简单的特殊二叉树——堆,堆排序是基于堆这种数据结构的排序方法。优先队列是基于堆最基础的几个基本操作的应用,甚至就操作来看可以说优先队列就是堆本身。但是优先队列数据结构在实际应用中的直观感受来看更倾向于添加了优先级这个属性的队列,所以称它为优先队列。事实上实现优先队列除了堆还有其他的实现方式,基于堆的实现是最合适的一种。Priority queue队列是前面已经学过的数据结构,这里不多作赘述。优先级并不是依靠单个变量能够产生的属性。当存在多个同种

2022-02-24 00:42:36 316

原创 Lecture 11

绪论作为树状数据结构最为重要的一个分支——二叉树,和课本一样,在树的后面单独拿出来进行介绍。Binary treeBinary tree就是二叉树的意思。在实现和了解二叉树的应用之前,首先需要明白二叉树的定义是什么。有课件上的定义如下:二叉树的每个结点有两个孩子,每个孩子可能为空或者另一棵二叉树子树。有另外的定义如下:每个结点的度都小于等于n的树称为n叉树。我本来认为这样的定义远比上面模糊且抽象的定义要更加精简确切,但当我仔细品味英文定义中exactly这个词的意思,又有了新的理解:因为

2022-02-22 16:08:37 682

原创 Lecture 10

绪论第十章对应的是课本上第六章的第一节,也就是树。Tree structure树是离散数学中图论里面的一个概念,数据结构中的树一般都是指的离散数学中的有根树(且一般是有向的)。有关树的性质离散数学中介绍的要比数据结构详细很多,有关树的概念和性质建议直接看离散数学,这里只做部分知识和概念的复习。Parent,Children,Siblings首先讨论的是结点与结点之间的关系。如果两个结点相邻,对于两个结点构成的边,起点为终点的parent(父节点),终点为起点的chidren(子节点)。例如下面

2022-02-21 10:55:28 446 2

原创 Lecture 9

绪论这一章节介绍的是divide-and-conquer multiplication,divide的意思是分开,conquer的意思是占据,控制,divide-and-conquer直译下来就是分开后控制,其实就是分而治之的意思,multiplication的意思是乘法。divide-and-conquer multiplication算法的主要核心思想就是分治,通过分治来简化各种较为复杂的乘法运算。Integer Multiplication首先讨论实数与实数(整型与整型,浮点型与浮点型)之间的

2022-02-13 22:50:10 323

原创 Lecture 8

绪论Lecture 7主要介绍的是冒泡排序的一些优化和归并排序的相关知识点,这一章节介绍的就是快速排序,快速排序作为目前内置排序函数源码所用的算法,重要性不言而喻,并且快速排序虽然运行效率高,但是在不同情况下的运行效率差异很大,对于不同的情况也需要不同的处理策略。The idea behind the algorithm归并排序是将一个序列等分成两个子序列,然后将两个子序列进行合并,算法基于的核心思想是递归分治算法。快速排序直接从代码的角度来看感觉和递归分治算法类似:选取序列中的一个元素的值作为

2022-02-09 19:48:44 695

原创 Lecture 7

绪论Lecture 7和lecture 8两章介绍的都是有关排序的部分,说是十种排序,其实最主要介绍的一般都是快速排序和归并排序。Bubble Sort冒泡排序就是每次将当前序列中优先级最大的元素“上浮”到当前序列的最后。每次内部的循环将当前序列中的每个元素从前到后遍历一遍,遍历的过程中将当前遍历到的优先级最大的元素向后调整,与优先级最小的元素交换位置,这个过程我们称之为“上浮”。所以有一般的代码如下:void bubble_sort(int*a,int n){ for (int i=0;i

2022-01-30 13:59:23 1401

原创 Lecture 5

绪论这一章介绍的内容是哈希表,又叫哈希技术。有关哈希技术,很多人是从十大排序中的哈希排序中了解到的。事实上哈希排序是计数排序和哈希技术的结合,哈希计数用来快速查找的功能更为地基础和根本,课件就是从这方面逐步介绍哈希技术的用处和设计方法以及技巧(技巧方面与课本上的大差不差)。Introduction首先有这样的一个例子:假设存在一个系统中有大约150个错误(异常)情况,每一种情况由一个2进制的16位数标识,更为确切的说法是作为索引。现在需要通过16位的标识符来调用相应地错误处理函数。一种做法是

2022-01-28 14:36:35 1200 6

原创 Lecture 4

绪论比起课本上更加详细的时间复杂度的介绍。Justification for analysis这一章的标题是algortihm analysis,也就是算法分析。算法是用数学,计算机来解决问题的方法,在得到算法之后,我们需要从算法运行的快慢,空间的占用大小,利用率,出错的概率等不同的角度来评判和比较这些算法,从而在不同的场合选择不同的算法。这个评判和比较的过程从学科专业的角度就叫做算法分析。ppt这里举了一些例子,比如在有序表中寻找某个元素。这里提供了线性查找和二分查找两种算法。初始化

2022-01-23 16:32:57 970

原创 Lecture 3-2

绪论Lecture3-2介绍的就是队列的实现和应用,不过应用这部分就是最简单的一些和概念关系比较大的应用。Queue ADT同样是线性的数据结构。比起前面的数据结构,队列稍微有点特殊的就是有一个队首(front)和一个队尾(back,不过很多时候都叫rear),队首出队(pop),队尾进队(push),先进队的先出队,后进队的后出队,满足FIFO(先进先出)原则。更常规的,像课本就是用enqueue,dequeue作为操作名的,不过head和tail我基本没有见到过。和栈一样,队列的实现方

2022-01-21 22:23:56 175

原创 Lecture 3-1

绪论大致地看了一下,这一章主要介绍的是栈的概念及其运用。除了一些最为人熟知的如递归栈,波兰逆波兰表达式,还有一些比较特殊的课本上没有的应用。Stack ADTlinear(线性的),说明栈依旧是一个线性的数据结构。栈的基本操作比较少,就是进栈,出栈,创建(销毁)和判空(判满这个操作是有点争议的,因为链栈是不会出现爆栈的情况)。栈有链表和数组的两种实现方式:Singly linked lists前面的单链表的模板类:基于单链表的链栈的模板类:事实上所有的操作都是lecture 2单链

2022-01-21 13:51:57 843

原创 Lecture 2

绪论有关线性表的介绍,书上首先提出了下面这样一个问题(例子):如何计算一个多项式(polynomial)的值?就算法的角度而言,主要是以下两种思路:第一种是最常规的做法,将多项式中的每一个单项式分别计算出他们的结果相加,但这么做会重复计算很多次x方幂。更值得提倡的做法是第二种,用类似与递推的方法通过i-1次多项式的值来求i次多项式的值,因为i-1次多项式中0次到i-1次的部分已经计算完成,于是不会出现太多重复计算的情况。算法大致如上,接下来的问题是用哪种数据结构。如果是用普通的顺序存储结构

2022-01-19 20:28:43 486

原创 第九章——哈希表

哈希表在了解哈希技术及哈希表之前,首先希望大家对计数排序有一个比较基本的了解(很多人更习惯称计数排序为桶排序,真正意义上的桶排序即是计数排序和哈希技术的结合)。计数排序中有一个桶的概念,就是将数据n放在编号为n的桶中,用数组元素c[i]来表示编号为i的桶。这样可以用c[i]来查询编号为i的数字在序列中出现的次数,最简单的我们可以通过c[i]的下标i知道查询的编号为i。对于数据表中若干的数据,我们也希望用计数排序中同样的方法将出现的数据存储在数组中。但问题就在于出现的数据往往过于分散,导致数组空间的利用

2021-12-31 11:16:18 578

原创 第九章——AVL树

树表的查找上一个章节介绍了顺序表中的查找,其中以折半查找,也就是二分查找的效率最高。但是二分查找需要顺序表中的元素有序排列,如果顺序表是动态的,随时需要添加和删除元素,为了维护表的有序性,需要前移和后移表中的很多元素,时间复杂度比较高。所以需要用一些特殊的二叉树/树作为表的存储结构,这里统称为数表。二叉排序树有关二叉排序(搜索)树的介绍和知识点看这篇文章,这里只作代码和例题的解释。二叉排序树的存储结构二叉排序树的存储结构和普通二叉树是一致的。//key为关键字,data为其他数据项,lchi

2021-12-31 03:41:00 498

原创 第九章——线性表查找

查找查找的定义就是在存储着若干个元素的数据结构中找出关键字为k的元素的过程。如果在查找的过程中同时对表进行修改,那么称这个表为动态查找表,否则为静态查找表。pi为查找表中第i个元素的概率,ci查找到表中第i个元素需要进行的关键字比较的次数,定义ASL=Σ(pi*ci)为查找成功的平均查找长度,同样地自然有查找失败的平均查找长度。查找算法的ASL值越大,时间性能越差,反之,时间性能越好。线性表查找顾名思义就是在线性表中进行查找。顺序查找这个代码就不演示了,顺序查找就是将所有的元素全部遍历一遍

2021-12-30 02:28:49 775

原创 第八章——拓扑排序

拓扑排序首先看这样一个问题:给定n个变量(1-n),和m个二元组(u,v),表示变量u<v。输出所有变量从小到大排列出来的结果。关于这个问题的解答,详见这篇文章这里只提供代码。int g[maxn][maxn];//表示有向边的集合 int flag[maxn],ans[maxn],n,m,t;//flag表示是否被访问过(0表示没有,-1表示正在访问,1表示已经访问过了) bool dfs(int u){ flag[u]=-1;//表示正在访问中 //开始进行访问

2021-12-30 00:26:34 370

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除