数据结构与算法分析-C语言描述(原书第二版)
学习记录和学习笔记
帅到没朋友fx
这个作者很懒,什么都没留下…
展开
-
图论算法-深度优先搜索的应用
图论算法-深度优先搜索的应用深度优先生成树深度优先生成树(depth-first spanning tree)的步骤:一个图从AAA顶点开始生成树,则A就是该树的根,是第一个没访问到的顶点。图中的每一条边(v,w)(v,w)(v,w)都出现在树上。如果当我们处理(v,w)(v,w)(v,w)时,发现www是未被标记的,或当我们处理(w,v)(w,v)(w,v)时发现vvv是未标记的,那么我们就...原创 2020-02-15 16:05:22 · 1006 阅读 · 0 评论 -
图论算法-最小生成树
图论算法-最小生成树在一个无向图中找出一颗最小生成树(minimum spanning tree),这个问题对有向图也是有意义的,不过找起来更困难。最小生成树存在当且仅当图GGG是连通的。在最小生成树中边的条数为∣V∣−1\left | V \right |-1∣V∣−1。Prim算法在每一步,都要把一个节点当作根并往上边加。在算法的任一时刻,我们都可以看到一个已经添加到树上的顶点集,而其余...原创 2020-02-13 21:03:10 · 270 阅读 · 0 评论 -
图论算法-最短路径算法
图论算法-最短路径算法无权最短路径从图G中,选择s为开始的点,从s到s的最短路径是长为0的路径,将这个信息做个标记;然后开始寻找所有与s距离为1的顶点,将这些顶点做标记;然后开始找出从s出发最短路径恰为2的顶点;直到所有顶点已经被计算。这种搜索一个图的方法称为***广度优先搜索(breadth-first search)*。该方法按层处理顶点:距开始点最近的那些顶点首先被赋值,而最远的那些顶...原创 2020-02-12 21:45:05 · 360 阅读 · 1 评论 -
图的拓扑排序
拓扑排序拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从viv_ivi到vjv_jvj的路径,那么在排序中vjv_jvj出现在viv_ivi的后面。如果图含有圈,那么拓扑排序是不可能的。此外,排序不必是唯一的;任何合理的排序都是可以的。算法思想第1种先找出任意一个没有入边的顶点。然后显示出该顶点,并将它和它的边一起从图中删除。然后对图的其余部分应用同样的方法处理。伪代...原创 2020-02-06 11:09:41 · 143 阅读 · 0 评论 -
并查集(不相交集)的路径平分
路径平分(path halving)通过使在从iii到根的路径上的每一个其他节点指向它的祖先(存在时)以实现对Find(i)Find(i)Find(i)的偏路径压缩(partial path compression)。这叫做路径平分(path halving)。一开对其性质理解的不够深,弄不清楚到底是从XXX本身开始指向祖父,还是从XXX的父节点才开始指向祖父,到最后XXX是否连接在根上;到...原创 2020-02-04 21:05:36 · 189 阅读 · 0 评论 -
并查集(不相交集)的Remove操作
给并查集(不相交集)的添加一个Remove(X)Remove(X)Remove(X)操作,该操作把XXX从当前的集合中除去并把它放到自己的集合中。实现思想英文原句We assume that the tree is implemented with pointers instead of a simple array. Thus Find will return a pointer inst...原创 2020-02-04 15:53:24 · 291 阅读 · 0 评论 -
并查集(不相交集)的Deunion操作
在并查集(不相交集)中附加操作DeunionDeunionDeunion,它实现的功能是取消最后一次UnionUnionUnion的操作。实现思想初始化一个空栈,将每一次的UnionUnionUnion操作的两个集合的根和其值PushPushPush入栈;若执行DeunionDeunionDeunion操作时,只需要对栈进行PopPopPop操作即可。在没有路径压缩时,这个策略是有效的;若并查...原创 2020-02-04 15:18:34 · 253 阅读 · 0 评论 -
左式堆的懒惰删除
左式堆的懒惰删除在左式堆中一个已知位置删除节点的一种方法是使用懒惰策略。要删除一个节点,只要将其标记为已被删除即可。当执行一个FindMinFindMinFindMin或DeleteMinDeleteMinDeleteMin时,若标记根节点被删除则存在一个潜在的问题,因为此时节点必须被实际删除且需要找到实际的最小元,这可能涉及到删除其他一些已做标记的节点。在该方法中,DeleteDeleteD...原创 2020-02-03 11:34:43 · 1729 阅读 · 0 评论 -
C语言实现二叉堆BuildHeap操作
优先队列(二叉堆)BuildHeap操作BuildHeapBuildHeap(H)BuildHeap(H)BuildHeap(H)操作把NNN个关键字作为输入并把它们放入空堆中。显然,这可以使用NNN个相继的InsertInsertInsert操作来完成。由于每个InsertInsertInsert将花费O(1)O(1)O(1)平均时间以及O(logN)O(\log N)O(logN)的最坏...原创 2020-02-01 19:23:50 · 1263 阅读 · 0 评论 -
线索二叉树
线索二叉树由于具有NNN个节点的二叉查找树有N+1N+1N+1的NULLNULLNULL指针,因此在二叉查找树中指定给指针信息的空间的一半被浪费了。若一个节点有一个NULLNULLNULL左孩子,我们使它的左儿子指向它的中缀前驱(inorder predecessor),若一个节点有一个NULLNULLNULL右孩子,我们让它的右儿子指向它的中缀后继(inorder successor)。这就...原创 2020-01-29 13:00:50 · 266 阅读 · 0 评论 -
二叉树的层次遍历
二叉树的层次遍历需要用到二叉树和队列两个数据结构,利用队列的先进先出原则。首先把根节点入队,然后出队的同时把根节点的左右子节点入队(如果有),一直执行直到队列为空。输出的顺序就是按照二叉树的层次输出。void PrintLevel(Tree T){ Queue Q; Q = CreateQueue(); // 创建一个空队 Enqueue(T, Q); // 把树的根节点入队 w...原创 2020-01-28 20:21:03 · 125 阅读 · 0 评论 -
数据结构与算法分析-树
树对于大量的输入数据,链表的线性访问时间太慢,不宜使用。预备知识*树(tree)可以用几种方式定义。定义树的一种自然的方式是递归的方法。一棵树是一些节点的集合。这个集合可以是空集;若非空,则一棵树由称做根(root)的节点rrr以及0个或多个非空的(子)树T1,T2,⋯ ,TkT_1,T_2,\cdots,T_kT1,T2,⋯,Tk组成,这些子树中每一棵树的根都被来自根rrr的一条有向...原创 2020-01-22 22:29:11 · 315 阅读 · 0 评论 -
数据结构与算法分析-队列
队列ADT像栈一样,队列(queue)也是表。然而,使用队列时插入在一端进行而删除则在另一端进行。队列模型队列的基本操作是EnqueueEnqueueEnqueue(入队),它是在表的末端(叫做队尾(rear))插入一个元素,还有DequeueDequeueDequeue(出队),它是删除(或返回)在表的开头(叫做队头(front))的元素。队列的数组实现如同栈的情形一样,对于队列而言任...原创 2020-01-20 18:53:16 · 326 阅读 · 0 评论 -
数据结构与算法分析-栈
栈ADT栈模型栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有PushPushPush(进栈)和PopPopPop(出栈),前者相当于插入,后者则是删除最后 插入的元素。最后插入的元素可以通过使用TopTopTop例程在执行PopPopPop之前进行考查。对空栈进行的PopPopPop或TopTopTop一般被认为是栈的ADT的...原创 2020-01-20 16:38:51 · 414 阅读 · 0 评论 -
数据结构与算法分析-表
表抽象数据类型抽象数据类型(abstract data type,ADT) 是一些操作的集合。抽象数据类型是数学的抽象;在ADT的定义中根本没涉及如何实现操作的集合。表ADT将处理一般的形如A1,A2,A3,⋯ ,ANA_1,A_2,A_3,\cdots,A_NA1,A2,A3,⋯,AN的表。这个表的大小是NNN。称大小为0的表为空表(empty list)。对于除空表外的任何...原创 2020-01-19 20:07:31 · 300 阅读 · 0 评论 -
数据结构与算法分析-算法分析
算法分析算法(algorithm)是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。数学基础**定义:**如果存在正常数ccc和n0n_0n0使得当N≥n0N\geq n_0N≥n0时T(N)≤cf(N)T(N)\leq cf(N)T(N)≤cf(N),则记为T(N)=O(f(N))T(N)=O(f(N))T(N)=O(f(N))。**定义:**如果存在正常数ccc和n0n_0...原创 2020-01-17 21:52:36 · 352 阅读 · 0 评论 -
数据结构与算法分析-引论
数学知识复习指数XAXB=XA+BX^AX^B=X^{A+B}XAXB=XA+BXAXB=XA−B\frac{X^A}{X^B}=X^{A-B}XBXA=XA−B(XA)B=XAB(X^A)^B=X^{AB}(XA)B=XABXN+XN=2XN≠X2NX^N+X^N=2X^N\neq X^{2N}XN+XN=2XN=X2N对数在计算机科学中,除非有特别的声明,所有的对数都是以2...原创 2020-01-17 21:49:16 · 240 阅读 · 0 评论