![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
yang_jianfeng
这个作者很懒,什么都没留下…
展开
-
数据结构与算法C++(二十一)分支定界
分支定界一、算法思想分支定界(branch and bound)是另一种系统地搜索解空间的方法。它与回溯法的主要区别在于E-节点的扩充方式。每个活动节点仅有一次机会变成E-节点。当一个节点变为E-节点时,从该节点移动一步即可到达的节点都是生成的新节点,在生成的节点中,那些不可能导出(最优)可行解的节点被舍弃(成为“死”节点),剩余节点加入活动节点表,然后从表中选择一个节点作为下一个E-节点。将选择的节点从表中删除,然后扩展。这种扩展过程一直持续到一个解找到了或活动表成为空表。有两种常用的方法可用来选择原创 2020-10-08 12:50:00 · 498 阅读 · 0 评论 -
数据结构与算法C++(二十)回溯法
回溯法要求解一个问题,最可靠的一种方法是:列出所有候选解,然后逐个检查,在检查所有或部分候选解后,便可找到所需要的解。理论上,只要候选解的数量有限,而且在检查了所有或部分候选解之后可以确定所需解,这种方法就是可行的。不过在实际应用中,这种方法很少用,因为候选解的数量通常都非常大。而即使速度最快的计算机,也只能对实例规模相当小的问题在合理的时间内解决。回溯法和分支定界法是对候选解进行系统检查的两种方法。这两种方法使最坏情况下和一般情况下的求解时间大大减少。事实上,这两种方法使我们省去了对很大一部分候选解的原创 2020-10-08 12:36:43 · 156 阅读 · 0 评论 -
数据结构与算法C++(十九)动态规划
动态规划动态规划的应用问题:背包、矩阵乘法链、最短路径、无交叉子集。一、算法思想二、应用原创 2020-10-08 12:23:29 · 86 阅读 · 0 评论 -
数据结构与算法C++(十八)分而治之
分而治之分而治之算法把一个问题实例分解为若干个小型而独立的实例,从而通过推导最小最大问题和排序问题的复杂度下限,来证明用分而治之算法能够得到这两个问题的最优解。一、算法思想分而治之方法与软件设计的模块化方法非常相似。一个问题的小实例可以用直接方法求解。而要解决一个问题的大实例,可以(1)把它分成两个或多个更小的实例;(2)分别解决每个小实例;(3)把这些小实例的解组合成原始大实例的解。二、应用三、解递归方程四、复杂度的下限...原创 2020-10-08 11:56:29 · 336 阅读 · 0 评论 -
数据结构与算法C++(十七)贪婪算法
贪婪算法贪婪算法是一种非常直观的求解方法。虽然设计一个问题的贪婪算法通常是很容易的,但是设计出来的方法未必能产生最优的解。因此,我们实质上要显示一个贪婪算法是如何进行的。即使贪婪算法不能保证最优解,但是它们依然是有用的,因为它们常常使我们得到近似最优的解。应用贪婪算法可以求解货箱装载问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题和最小代价生成问题。一、最优化问题二、贪婪算法思想三、应用...原创 2020-10-08 11:47:37 · 144 阅读 · 0 评论 -
数据结构与算法C++(十六)图
图一、基本概念图(graph)是一个用线或边连接在一起的顶点或节点的集合。原创 2020-10-08 11:37:12 · 95 阅读 · 0 评论 -
数据结构与算法C++(十五)平衡搜索树
平衡搜索树如果搜索树的高度总是O(logn),我们就能保证查找、插入和删除的时间为O(logn)。最坏的情况下的高度为O(logn)的树称为平衡树(balanced tree)。AVL树的特征:1.一棵n个元素的AVL树,其高度是O(logn)。2.对于每一个n,n>=0,都存在一棵AVL树。3.对一棵n元素的AVL搜索树,在O(高度)=O(logn)的时间内可以实现查找。4.将一个新元素插入一棵n元素的AVL搜索树中,可以得到一棵n+1个元素的AVL树,而且插入用时为O(logn)。5原创 2020-08-28 23:39:28 · 146 阅读 · 0 评论 -
数据结构与算法C++(十四)搜索树
搜索树原创 2020-08-28 23:26:48 · 109 阅读 · 0 评论 -
数据结构与算法C++(十三)竞赛树
竞赛树竞赛树的基本操作是替换最大(或最小)元素。如果有n个元素,这个基本操作的用时为O(logn).。虽然用堆和左高树来表示也能用近似的时间(原创 2020-08-23 17:36:33 · 284 阅读 · 0 评论 -
数据结构与算法C++(十二)优先级队列
优先级队列一、定义与应用优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先级队列执行的操作有1)查找一个元素;2)插入一个新元素;3)删除一个元素。与这些操作分别对应的函数是top、push和pop。在最小优先级队列(min priority queue)中,查找和删除的元素都是优先级最小的元素;在最大优先级队列(max priority queue)中,查找和删除的元素都是优先级最大的元素。优先级队列的元素可以有相同的优先级,对这样的元素,查找和删除原创 2020-08-22 23:46:25 · 195 阅读 · 0 评论 -
数据结构与算法C++(十一)二叉树和其他树
二叉树和其他树一棵二叉树(binary tree)t是有限个元素的集合(可以有空)。当二叉树非空时,其中有一个元素称为根,余下的元素(如果有的话)被划分成两棵二叉树,分别称为t的左子树和右子树。二叉树和树的根本区别是:二叉树的每个元素都恰好有两棵子树(其中一个或两个可能为空)。而树的每个元素可有任意数量的子树。在二叉树中,每个元素的子树都是有序的,也就是说,有左子树和右子树之分。而树的子树是无序的。...原创 2020-08-22 23:17:50 · 125 阅读 · 0 评论 -
数据结构与算法C++(十)跳表和散列
跳表和散列虽然在n个元素的有序数组上折半查找所需要的时间为O(logn),但是在有序链表上查找所需要的时间为O(n)。为了提高有序链表的查找性能,可以在全部或部分节点上增加额外的指针。在查找时,通过这些指针,可以跳过链表的若干个节点,不必从左到右连续查看所有节点。增加了额外的向前指针的链表叫做跳表(skip list)。它采用随机技术来决定链表的哪些节点应增加向前指针,以及增加多少个指针。基于这种随机技术,跳表的查找、插入、删除的平均时间复杂度为O(logn)。然而,最坏的情况下的时间复杂度却变成O(n原创 2020-08-22 21:10:23 · 176 阅读 · 0 评论 -
数据结构与算法C++(九)队列
队列队列和栈一样,是一种特殊的线性表。队列的插入和删除操作分别在线性表的两端进行,因此,队列是一个先进先出(FIFO)的线性表。插入元素的那一端称为队尾(back或rear),删除元素的那一端称为队首(front)。...原创 2020-08-18 23:34:21 · 152 阅读 · 0 评论 -
数据结构与算法C++(八)栈
栈栈和队列很可能是应用频率最高的数据结构。把线性表的插入和删除操作限制在同一端进行,就得到栈数据结构。因此,栈是一个后进先出(last-in-first-out,LIFO)的数据结构。因为栈是一种特殊的线性表,所以从相应的线性表类派生出栈类是很自然的事情。一、定义和应用栈(stack)是一种特殊的线性表,其插入(也称为栈和压栈)和删除(也称出栈或弹栈)操作都在表的同一段进行。这一端称为栈顶(top),另一端称为栈底(bottom)。二、抽象数据类型三、数组描述四、链表描述五、应用...原创 2020-08-16 12:36:24 · 131 阅读 · 0 评论 -
数据结构与算法C++(七)数组和矩阵
数组和矩阵在实际应用中,数据通常以表的形式出现。尽管用数组来描述表是最自然的方式,但为了减少程序所需的时间和空间,经常采用自定义的描述方式。矩阵经常用二维数组来描述。矩阵的索引通常从1开始,而C++的二维数组是从0开始。矩阵的操作有加法、乘法和转置。但是C++的二维数组不支持这些操作。因此开发了matrix类。一、数组二、矩阵三、特殊矩阵四、稀疏矩阵一个m*n的矩阵,如果大多数元素都是0,则成为额稀疏矩阵(spare matrix)。一个矩阵如果不是稀疏的,就称为稠密矩阵(dense mat原创 2020-08-16 12:28:11 · 374 阅读 · 0 评论 -
数据结构与算法C++(二)
程序最重要的属性是正确性。程序性能(performance of a program)是指运行这个程序所需要的内存和时间的多少。我们用两种方法来确定一个程序的性能,一个是分析方法,另一个是实验方法。在性能分析(performance analysis)时,采取分析方法,而在性能测量(performance measurement)时,使用实验方法。一个程序的空间复杂度(space complexity)是指该程序的运行所需内存的大小。...原创 2020-05-22 19:39:37 · 149 阅读 · 0 评论 -
数据结构与算法C++(六)
在链式描述中,线性表的元素在内存中的存储位置是随机的。每个元素都有一个明确的指针或链(指针和链是一个意思)指向线性表的下一个元素的位置(即地址)。在基于数组的描述中,元素的地址是由数组公式决定的。而在链式描述中,元素的地址是随机分布的。STL的容器list使用带有头节点的双向循环链表来描述实例。它的方法与vector的方法具有相同的签名和操作。因此,它的erase和insert的签名和抽象数据类型linearList的要求不同,然而和vector一样,它可以用来设计从抽象类linearList派生的具体原创 2020-05-31 23:40:53 · 110 阅读 · 0 评论 -
数据结构与算法C++(五)
C++程序常用的数据描述方法是数组描述和链式描述。线性表可以用来说明这两种方法。STL容器(vector和list)大致相当于线性表的数组描述方法和链式描述方法。STL的类还有很多其他的方法。在建立线性表的数组描述和链式描述中,我们使用的函数名和签名与STL代码所使用的相同。...原创 2020-05-31 23:33:21 · 125 阅读 · 0 评论 -
数据结构与算法C++(四)
性能测量(performance measurement)关注的是一个程序实际需要的空间和时间。对运行空间,我们无法明确的考量,这是因为如下两个因素:1.指令空间和静态分配的数据空间是由编译器在编译时确定的,它们的大小可以用操作系统指令来得到;2.递归栈空间和动态分配的变量空间可以用前面的分析方法明确地估算。...原创 2020-05-27 23:41:43 · 123 阅读 · 0 评论 -
数据结构与算法C++(三)
考察程序的操作计数和执行步数有两个重要的原因:1.预测程序运行时间如何随着实例特征的变化而变化;2.对两个功能相同的程序,比较它们的时间复杂度。渐进记法(asymptotic notation)描述的是大实例特征的时间或空间复杂度。我们将用它来分析步数(其实还可以用它来分析空间复杂度和操作步数)。时间复杂度和步数是同义词。...原创 2020-05-26 23:32:04 · 124 阅读 · 0 评论 -
数据结构与算法C++(一)
程序开发过程要求两点:1.高效的数据描述;2.步骤合理、可用程序实现的算法设计。C++特性如下:1.参数传递的不同方式(如值传递、引用传递和常量引用传递);2.函数或方法返回的不同方式(如值返回、引用返回和常量引用返回);3.模板函数;4.递归函数;5.常量函数;6.内存分配和释放函数:new和delete;7.异常处理结构:try、catch和throw;8.类与模板类;9.类的公有成员、保护成员和私有成员;10.友元;11.操作符重载;12.标准模板库。...原创 2020-05-17 15:47:13 · 173 阅读 · 0 评论