![](https://img-blog.csdnimg.cn/20190504101430259.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法分析-C++描述
数据结构与算法分析-C++描述 章节目录及编程练习
qq_37172182
i++, ++i, c++, g++, x++
展开
-
数据结构与算法分析-C++描述 第10章 算法设计技巧(回溯算法之公路收费点重建问题)
算法设计技巧五:回溯算法(backTracing) 回溯算法相当于穷举搜索的巧妙实现,即排除一定条件的穷举情况,从而不必完全穷举。相对于蛮力穷举,回溯算法能显著减轻工作量。在许多情况下,回溯算法的性能不是很理想。但性能是相对的:对于排序算法,的算法相当糟糕,但对于旅行商(或任意NP完全)问题,算法则是里程碑式的突破。公路收费点重建问题行为描述: 设给定个点,他们位...原创 2019-05-22 20:39:17 · 335 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第10章 算法设计技巧(随机化算法之跳跃表)
算法设计技巧四:随机化算法(Random Algorithm): 在算法设计中,随机数至少有一次用于决策,该算法的运行时间不仅取决于特定的输入,而且依赖于所出现的随机数的算法称为随机化算法。 随机化算法的最坏运行时间几乎总是和非随机化算法的最坏运行时间相同。重要的却别在于,好的随机化算法,没有不好的输入,只有不好的随机数(相对于特定的输入)。 ...原创 2019-05-19 16:42:35 · 417 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第10章 算法设计技巧(动态规整之最优二叉搜索树)
算法设计技巧三:动态规整(dynamic programming) 在上篇分治算法中看到,一个可以被数学上递归表示的问题也可以表示成递归算法,在许多情况下对朴素的穷举搜索得到显著的性能改进。由于编译器常常不能正确对待递归算法,结果产生低效的程序。将递归算法改写成非递归的方式,将子问题的答案系统地记录在一张表中,这种算法技巧称为动态规整。用表代替递归: 使用递...原创 2019-05-18 10:54:46 · 338 阅读 · 1 评论 -
数据结构与算法分析-C++描述 第10章 算法设计技巧(分治算法之最近点对问题)
算法设计技巧二:分治算法(divide and conquer) 算法设计的另一有效算法为分治算法,分治算法包括两步: 1)分(divide):递归解决较小的问题(当然基本情况除外); 2)治(conquer):从子问题中构建原问题的解; 可以看到,在之前的归并排序、快速排序、以及无向图深度优先搜...原创 2019-05-16 23:05:04 · 794 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第10章 算法设计技巧(贪心算法之霍夫曼编码)
算法设计技巧一 :贪心算法(Greedy Algorithm) 在第9章曾多次遇到贪心算法的应用,如解决单源最短路径的Dijkstra算法,最小生成树的Prim算法,最小生成树的Kruskal算法。贪心算法分阶段进行。在每一阶段可以认为所做的决定是最好的,而不考虑将来的结果。一般来说,这意味着选择是某个局部优的。这种“眼下能够拿到的就拿”的策略即是这类算法名称的来源。当算法结束时...原创 2019-05-15 21:07:30 · 372 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(欧拉回路问题之Fleury算法)
背景(background): 考虑下图三个图形,要求不重复地走完所有路径。其中,若能回到起点,则这样的环路称为欧拉回路(Euler Circuit),若能不重复走完路径,但终点不一定是起点,则这样的环游称为欧拉环游(Euler tour)。两种问题统称为欧拉路径问题(Euler Path Problem)。两种欧拉路径问题随然稍有不同,但解法思路一致,以欧拉回路问题介绍Fl...原创 2019-05-12 11:05:11 · 3458 阅读 · 2 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(最小生成树之Kruskal算法)
背景介绍: 在上一篇 数据结构与算法分析-C++描述 第9章 图论算法(最小生成树之Prim算法)中介绍了最小生成树的Prim算法实现,该算法通过每次比较当前顶点与连接顶点的距离和上一顶点与连接顶点的距离寻找最小值的方式生成最小树。本篇将介绍实现最小生成树的另一贪心算法——Kruskal算法。Kruskal算法语言描述: Kruskal算法的贪心策略是连续地按...原创 2019-05-10 10:10:36 · 382 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(最小生成树之Prim算法)
最小生成树(Minimum SpanningTree, MST): 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。在给定的无向图中,表示顶点指向的权值,如存在为的子集的非连通图,存在有最小值时对应的称为的最小生成树。 最小生成树是现实生活中铺设电线、光纤等具有连通性质的问题的抽象。对于任...原创 2019-05-09 11:48:20 · 270 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(字梯游戏之Dijkstra算法应用)
背景介绍: 在数据结构与算法分析-C++描述 第9章 图论算法(单源最短路径问题之Dijkstra算法邻接表实现)中,通过介绍Dijkstra算法使用非负加权有向图求解单源最短路径。本篇用通过一个游戏设计,进一步理解Dijkstra算法的应用。问题描述: 在字梯游戏中,每一个词都是通过将字梯中的前一个词改变一个字母实现的。例如,通过一系列的字母替换,将zer...原创 2019-04-27 11:45:27 · 358 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(全局点最短路径问题之Floyd算法动态规整)
在上一篇数据结构与算法分析-C++描述 第9章 图论算法(单源最短路径问题之Dijkstra算法邻接表实现)中介绍了贪心算法的经典代表Dijkstra算法。该算法是非负单源路径最短问题的极好解决方案,在使用优先队列时,每一次查找最小值使用时间,因此算法的最终时间复杂度为。在使用斐波拉契堆(后续学习中会见到该堆的实现)时,其算法的最终时间复杂度为。整体上讲,Dijkstra算法具有良...原创 2019-04-26 17:25:02 · 295 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(单源最短路径问题之Dijkstra算法邻接表实现)
单源最短路径问题(SingleSourceShortestPathProblem): 给定一个加权图和一个特定顶点作为输入,找到从到中每一个其他顶点的最短加权路径(如下图1示,求顶点1到顶点6的最短路径):即。 ...原创 2019-04-23 16:24:38 · 649 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(有向图之广度优先搜索和深度优先探索)
在上一篇无向图之广度优先搜索和深度优先探索中简单介绍了图的基本概念、图的表示方法以及最短路径问题,本篇通过原有基础改变无向图为有向图,则原无向图为该有向图的基础图。改变无向图为有向图的基本思路为:创建边时,不一定存在边,其中指顶点指向顶点的边【注不同的定义方式与编码有关,只要能反映图信息即可】。 因其更改很方便,这里直接给出代码,详细分析与无向图之广度优先...原创 2019-04-20 16:06:36 · 416 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第9章 图论算法(无向图之广度优先搜索和深度优先探索)
基本概念(basic conception): 1)图(graph):由边的集和顶点的集构成。如果点对是有序的,则称为有向图(digraph)。在一个具有边从而具有边的有向图中,与邻近且与邻近。 如果在无向图中,从每一个顶点到其他顶点都存在一条路径,则称该无向图是连通的(connected)。具有这种性质的有向图称为强连通的(strongly connected...原创 2019-04-19 19:24:22 · 862 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第8章 迷宫生成(不相交类的一个应用)
在不相交类中,定义了求并/查找函数极其灵巧方法,本次给出不相交类的一个应用:应用求并/查找数据结构的一个例子是迷宫的生成,如下图为一个10*10的迷宫。生成迷宫的一个简单的算法是从各处的墙壁开始(除了入口和出口外)。此时,不断地随机选择一面墙,如果被该墙分割的单元彼此不连通,那么就把这面墙拆掉,重复这个过程直到开始单元和终止单元连通,就得到一个迷宫。实际上,不断地拆掉墙壁直到每个单元都可...原创 2019-04-18 15:42:14 · 365 阅读 · 1 评论 -
数据结构与算法分析-C++描述 第8章 不相交集类(disjointSet)
背景介绍(background): 等价关系(equivalence relation):是满足下列三个性质的关系: 1)自反性:对所有的,;(其中表示关系); 2)对称性:当且仅当; 3)传递性:若且则; 举例:不具有等价性;电气连通性具有等...原创 2019-04-17 17:09:08 · 678 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 桶排序(bucketSort)
背景: 引理 1 :令是深度为的二叉树,则最多有片树叶【数学归纳法】 引理 2 :具有片树叶的的二叉树的深度至少为【由引理1可得】 定理 1 :只使用元素间比较的任何排序算法在最坏情况下至少需要次比较。【对个元素排序,必然有片数树叶】 定理 2 :只是用元素间比较的任何排序算法需要次比较。 ...原创 2019-04-17 09:10:38 · 279 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 间接排序(indirectionSort)
间接排序(indirectionSort): 直接应用基于谢尔排序、快速排序等这些算法的函数模板时,如果要排序的Comparable对象很大时,有时效率是很低的,问题在于,重新排列的Comparable对象时,进行了太多的复制工作,如果Comparable对象很大且难以复制,则代价将是很大的。解决的办法是:生成一个指向Comparable对象的指针数组,然后重新排列这些指针。一旦...原创 2019-04-14 19:25:13 · 591 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 快速排序(quickSort)
快速排序(quickSort): 快速排序(quickSort)算法曾被认为是理论上高度优化而实践中不可能正确编程的一种算法,但该算法简单易懂且不难证明,像归并算法一样,快速排序也是一种分而治之的排序算法。行为描述:算法描述: 1、枢纽元的选取:通常做法为选择数组中起始下标、中间下标和末尾下标对应的元素的中值已产生比较“平衡”的枢...原创 2019-04-14 11:30:51 · 318 阅读 · 2 评论 -
数据结构与算法分析-C++描述 第7章 归并排序(mergeSort)
归并序(mergeSort): 归并排序以最坏情形运行时间运行,所使用的比较次数几乎是最优的,而且是递归算法很好的例子。归并排序的基本操作是合并两个已排序的表。因为这两个表是已经排序的,所以若放到第三个表中,则该算法可以通过对输入数据的一趟排序来完成。行为描述:算法描述: 取两个输入数组A数组B、一个输出数组C及3个计数器(),它们的...原创 2019-04-14 10:51:29 · 355 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 堆排序(heapSort)
堆排序(heapSort): 使用优先队列的方法,第一步建立N个元素的二叉堆,总共花费时间,删除每个元素花费时间,则完成一次输出最小值总计花费时间,堆排序给出了至今所见的最佳大运行时间。 为了节省空间,可将删除的元素重新放回数组队尾,对于最小堆而言,最终的输出结果将是降序排列,为了习惯升序排序方式,需建立最大堆(最小堆),然后将“删除”根节点,放置v[N-1]处,进...原创 2019-04-13 21:21:14 · 255 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 谢尔排序(shellSort)
谢尔排序(shellSort): 通过比较一定间隔的元素进行工作,各趟比较随着算法的进行而减小,直到只比较相邻元素的最后一趟元素排序结束,因此谢尔排序有时也称缩减增量排序(diminishing increment sort).行为描述:算法描述: 谢尔排序使用一个序列,叫做增量序列(increment sequence)。只要,任何增量序列都是可...原创 2019-04-13 16:52:00 · 364 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第7章 插入排序(insertionSort)
插入排序(insertionSort): 插入排序是最简单的排序算法之一。插入排序由趟排序组成,对于到,插入排序保证从位置0到上的元素已经为有序状态。行为描述:算法描述: 在第趟时,将位置上的元素向左移动至前个元素中适当的位置<整体前移再插入从而无需反复交换元素>插入排序的性质: 插入排序的界:一些简单排序算法(冒泡...原创 2019-04-13 16:10:54 · 263 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第6章 二项队列ADT(BinomialQueue)
二项队列(BinomialQueue): 虽然左式堆和斜堆都以每次操作花费时间有效支持合并、插入和deleteMin,但还有改进的余地,因为我们知道,二叉堆以每次操作花费常数时间支持插入。二项队列支持所有这三种操作,每次操作的最坏运行情况为,而插入操作平均花费常数时间。 二项队列不同于其他优先队列的实现之处在于,一棵二项队列不是一棵堆序的树,而是堆序的树的集合,称...原创 2019-04-12 22:45:30 · 366 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第6章 斜堆ADT(SkewHeap)
斜堆(SkewHeap): 斜堆是左式堆的自调节形式,斜堆和左式堆的关系类似于伸展树和AVL树的关系。斜堆是具有堆序的二叉树,但是不存在对树的结构限制,且不保留零长路径的信息。斜堆的右路径在任何时刻都可以任意长,因此所有操作最坏运行情况为,正如伸展树一样,可以证明(还没证明出来 (┭┮﹏┭┮))对任意M次操作,总的最坏运行情况为,因此每次操作的摊还开销(amortized cost...原创 2019-04-09 16:51:48 · 721 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第6章 左式堆ADT(LeftistHeap)
左式堆(leftist heap): 由左结点形成的长路径构成的树(而且实际上更便于合并操作)称之为左式堆。零路径长(null path length): npl(x)定义为从x到一个不具有两个儿子结点的最短路径的长。因此具有0个或一个儿子的结点的npl(x) = 0。左式堆的性质: 1)对于堆中的每一个结点X,左儿子的路径长至少和右儿子...原创 2019-04-08 19:25:05 · 355 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第6章 优先队列ADT(最大堆和最小堆)
最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值;索引为0时对应的数组图示:二叉堆的添加示意图:二叉堆的删除示意图:实例:最大堆t和最小堆通用编程,只需要更改两处判断即可完成两种堆的实现。1、heap.h//heap.h#ifndef HEAP_H_#define HEAP_H_...翻译 2019-04-02 19:17:58 · 346 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第6章 优先队列ADT(二叉堆)
优先队列(priority queue) 是至少允许下列两种操作的数据结构:插入(insert);删除最小项(deleteMin),即找出、返回和删除最小项。优先队列的应用: 1)操作系统的任务调度(优先调度任务重要或任务短小的任务); 2)使用反复求最小元方式的贪心算法(greedy algorithm); 3)在离散模拟中的应用;二叉堆(堆):...原创 2019-04-02 19:07:10 · 533 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第5章 散列ADT(开放定址法)
开放定址法: 在上一篇数据结构与算法分析-C++描述 第5章 散列ADT(分离链接法)中提出散列的基本思想、散列函数以及解决冲突的两种方法:分离链接法和开放定址法,完成了分离链接法的实例应用,本篇承接上篇,实现开放定址法的实例应用。 分离链接法的缺点是使用了一些链表,由于给新单元分配地址需要时间(特别是在高级语言中),因此这导致了算法速度的下降,同时算法还要求第二种数据结...原创 2019-04-01 16:31:07 · 416 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第5章 散列ADT(分离链接法)
散列的基本思想: 理想的散列表数据结构只不过是一些包含一些项的具有固定大小的数组。项一般由键和数据成员构成,表的大小为散列数据的一部分,通常表的大小从0到,这为散列函数带来了处理上面的方便。散列函数: 将每个键映射到0到范围内的某个数,并将其放到适当的存储单元中。理想情况下散列函数应该计算简单而且保证任何两个不同的键映射到不同的单元,实际上这是不可能实现的,因为键...原创 2019-03-30 17:16:31 · 378 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第4章 红黑树(拓展)
红黑树(R-B Tree)是一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性: 1)每个节点或者是黑色,或者是红色; 2)根节点是黑色; 3)每个叶子节点(NIL)是黑色。注意:这里叶子节点,是指为空(NULL)的叶子节点! 4)如果一个节点是红色的,则它的子节点必须是黑色; 5)从一...翻译 2019-03-28 16:11:01 · 261 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第4章 B树
B树的性质: 1)树中每个结点最多含有m棵子树; 2)若根结点不是叶子结点,则至少有2个子树; 3)除根结点之外的所有非终端结点至少有棵子树; 4)每个非终端结点中包含信息:,其中: 1)为关键字,且关键字按升序排序; 2)指针指向子树的根结点,指向子树中所有结点的关键字均小于,且大于; 3)关...翻译 2019-03-27 16:53:30 · 365 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第4章 伸展树(splay树)
伸展树(splay tree)是一种相对简单的数据结构,它保证从空树开始任意连接次对树的操作最多花费时间。伸展树的基本思路:当一个节点被访问后,它就要经过一系列AVL树的旋转被推到根上。如果一个结点很深,那么在其路径上就存在相对较深的结点,通过重新构造可以使对所有这些结点的访问所花费的时间减少。另外,由于伸展树不要求保留高度或平衡信息,因此在某种程度上可以节约空间并简化代码。 ...翻译 2019-03-25 16:44:54 · 306 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第4章 平衡二叉树(AVL树)
一棵AVL树(Adelson-Velskii and Landis)是带有平衡条件的二叉树,其每个结点的左子树和右子树的高度差最多为1.。AVL树的重要定义:旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左),如图所示两种情况:四种定义:...翻译 2019-03-23 22:08:14 · 199 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第4章 二叉树ADT(二叉查找树)
二叉树(binary tree)是一棵每个节点都不能多于两个子节点的树。其递归结构如图所示: 二叉树的一个性质是平均二叉树的深度要比节点个数N小得多,分析表明,这个深度是,对于特殊类型的二叉树,即二叉查找树(binary search tree),其深度的平均值为。 二叉树有许多与搜索无关的重要应用,主要应用之一是在编译器的设计领域,一个例子--...原创 2019-03-22 19:54:44 · 612 阅读 · 1 评论 -
约瑟夫环的两种常见解法:链表解法和递归解法(C++版)
约瑟夫环问题: 直观解法 :链表解法。创建链表,判断删除节点是在N/2之前还是之后,进行模除运算,若在之前则从前往后遍历,保留间隔内数字,直到扫描到本次遍历结尾,输出本次遍历被删除的节点;若在之后,则从后往前遍历间隔内数字,直到扫面到本次遍历开头,输出本次遍历被删除的节点,逐次模除运算,最后的节点即为最终保留结果。#include<iostream>#in...原创 2019-03-21 17:02:30 · 449 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第3章 队列ADT(循环队列的两种实现)
像栈一样,队列(queue)也是一种表,与栈不同的是,队列的进队(enQueue)是在尾部(rear)进行,队列的出队(deQueue)是在头部(front)进行。 队列的实现:1)队列的数组实现;2)队列的链表表实现; 循环队列:解决队列空指针和内存空置问题,提高空间利用率; 判断为空:...原创 2019-03-21 16:36:56 · 462 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第3章 栈ADT(简单计算器设计)
栈(stack)是限制插入和删除只能在同一位置上进行的表(又称LIFO表),该位置是表的末端,称为栈顶。 栈的两种实现:1)栈的链表(单向链表)实现; 2)栈的数组(vector)实现; 栈的常见应用:1)平衡符号,用于编译器语法检错;2)后缀表达式:通过栈的形式完成数学运算,时间复杂度为O(N),执行效率高;3)中缀到后缀的转换;4)函数调用:堆和栈相...原创 2019-03-20 20:32:40 · 320 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第3章 双向链表(通用模板类型/泛型编程)
写在前面:使用gcc编译器(其他编译器应该也是)采用“三段式”进行模板类编程时,编译会出现 :error:"collect2: ld returned 1 exit status"。 原因分析:模板不是类和成员函数,模板的具体实现被称为实例化或具体化,除非编译器实现了新的export关键字,否则将模板函数放置在一个独立的文件中将无法运行,因为模板不是函数,它们不能单独...原创 2019-03-19 20:04:26 · 295 阅读 · 0 评论 -
数据结构与算法分析-C++描述 第2章 关于素数的前生今世
素数又称质数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。合数是由若干个质数相乘而得到的。所以,质数是合数的基础,没有质数就没有合数。 素数的性质: 1)存在无穷多个素数【反证法】; 2)存...原创 2019-03-10 21:32:17 · 400 阅读 · 0 评论 -
随机数发生器及其简单应用
Practice makes perfect!随机数产生原理:经典的随机数产生方法为是线性同余法,即Linear Congruence Generator (LCG),由Lehmer于1951年提出。同余:对于两个整数A,B,如果它们同时除以一个自然数M的余数相同,就说A,B对于模M同余,LCG 算法: X为随机序列,m 模除因子,a乘子(0 < a < m),c为增...原创 2018-10-08 17:30:02 · 1896 阅读 · 0 评论