![](https://img-blog.csdnimg.cn/20210104123715207.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 71
记录一些算法理解
razor521
杏肝学长,在线解答~
展开
-
数据结构——单链表模板类
数据结构相关笔记整理(一)这里主要是整理自己在学习数据结构的时候的笔记,这篇博客主要整理单链表的模板类附带几个内置函数的测试,新手上路,多多包涵,发现错误及时交流.....第一部分是主类代码:(直接贴了哈~~)#include #include #include "linearList.h"using namespace std;//定义单链表的模板类t原创 2017-09-24 22:15:56 · 892 阅读 · 1 评论 -
二叉树经典问题——已知中序和前序重建二叉树
运用前序和中序序列重建二叉树及其相关应用重建过程 1,在二叉树的学习中经常会遇到一类问题,就是给出一棵二叉树的前序和中序序列(后序和中序类似)然后求树的深度、树的后序序列、树的各种遍历等等问题,这个时候如果能根据相关的序列把其代表的二叉树重建出来,那么所有的问题便会迎刃而解。博文的第一部分就给出相关的重建步骤。 2,重建中最关键的一点是从前序中找根然后在后序中用相应的根把树‘分解’。举个例子:原创 2017-11-10 13:06:33 · 14375 阅读 · 3 评论 -
(接上一篇)二叉树的基本应用举例
后序遍历和层序遍历 上一篇博文中已经通过该死的递归把二叉树通过前序和中序序列给重建出来了,当然我们应该来应用这可二叉树,以便验证我们建立的效果。 当然,善于实践的你可能已经知道了上篇博文中的代码不能直接运行,因为里面还有其他的一些函数没有定义而只是给出了声明。如: 这两个函数是实现了后序遍历打印和层序遍历打印的功能,下面给出简要的阐述: 后序打印二叉树函数定义: 我们不禁感叹递归真原创 2017-11-10 13:46:13 · 1308 阅读 · 0 评论 -
线索二叉树的建立与遍历
概述 1,什么是线索二叉树? 用自己的话说就是:原来我们求一棵二叉树的前序、中序、后序序列的时候,都必须用到递归遍历相应的二叉树,否则也得借助栈等结构来记录。这样的话,如果我们想很快的找到某一个节点在某种序列下的前驱或后继,每次都要遍历,这显然十分浪费时间。很自然,要是想避免这个重复工作,那么我们就需要把所有节点的前驱和后继记录下来,这样每次查找相应的记录就行了。于是就引出了——‘线索’一词。没原创 2017-11-15 22:26:29 · 15320 阅读 · 3 评论 -
数据结构——最小堆的实现总结
堆的实用性 编程过程中,时常会遇到一种模型,我们收集到一些数据,并对其处理,但是我们需要首先处理这些数据中具有最小关键码或者最大关键码(Key:可以是根据数据的先后顺序或重要程度等给数据编的号码)的数据。我们希望有一种数据结构能够支持插入操作并能方便的从中取出具有最小或最大关键码的记录,这样的数据结构即为优先级队列,优先级队里的实现方式有多种,其中最高效的一种便是堆(heap)。堆的种类 堆有最原创 2017-12-01 13:54:10 · 12990 阅读 · 1 评论 -
运用并查集与最小堆实现Kruskal算法
前言 Kruskal是在一个图(图论)中生成最小生成树的算法之一。(另外还有Prim算法,之后会涉及到)这就牵扯到了最小生成树的概念,其实就是总权值最小的一个连通无回路的子图。(结合下文的示意图不难理解)这里的代码并没有用图的存储结构(如:矩阵,邻接链表等)来处理和运用这个算法,而是最简单的三元组输入,这样会使得这个过程简化很多,至于图的存储方式,在之后总结图数据结构的时候会具体讨论。Kruska原创 2017-12-01 22:24:31 · 4312 阅读 · 0 评论 -
并查集的理解与实现总结
并查集的应用十分广泛,包括一些算法,当应用上并查集的时候,也会更容易实现。下面总结下并查集的相关内容。 什么是并查集? 个人的理解是:并查集就是对集合三种常用操作的再一次抽象。分别是集合的合并(Union)、元素的搜索(Find)和对集合的分解。因为这3中操作非常常用并且又不囿于集合,所以就把这一组操作抽象成一个独立的数据结构。 标准定义 在一些应用问题中,需要将n个不同的元素划分成一组不相原创 2017-11-25 17:44:47 · 9279 阅读 · 3 评论 -
最小生成树Prim算法的理解
一、 Prim算法构造过程的数学概念1,原文引述 任意给定带权图N = {V, E},算法始终将顶点集合分成不重叠的两部分, V = V1 U (V - V1),也就是该图的一个割(cut)。其中V1是生成树的顶点集合,(V - V1)是图中不在生成树内顶点的集合。这里只考虑连通的网络(连通图),所以只要V1与(V-V1)均非空,他们之间就至少有一条边相连,称这种边为该割的一座桥(bridge)原创 2017-12-22 16:12:15 · 583 阅读 · 1 评论 -
认识堆排序的排序过程
1,实用的排序算法:选择排序(1)选择排序的基本思想是:每一趟(例如第i趟,i=0,1,2,3,……n-2)在后面n-i个待排序元素中选择排序码最小的元素,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素只剩下一个,就不用再选了。 (2)三种常用的选择排序方法 1>直接选择排序 2>锦标赛排序 3>堆排序 其中,直接排序的思路和实现都比较简单,并且相比其他排序算法,直接原创 2018-02-01 09:40:54 · 14992 阅读 · 1 评论 -
理解快速排序算法的排序过程
1,快速排序算法大概(1)快速排序(quick sort)也叫分区排序,是目前应用最广泛的排序算法。在标准C++类库中排序程序被称为qsort,因为快速排序是其实现中最基本的算法。 (2)排序算法的优点:好的快速排序算法在大多数计算机上运行得都比其他排序算法快,而且快速排序算法在空间上只使用一个小的辅助栈,其内部的循环也很小,另外快速排序算法也很容易实现,可以处理多种不同的输入数据,许多情况原创 2018-01-28 13:06:43 · 2660 阅读 · 0 评论 -
数据结构——链式队列模板类实现
数据结构笔记3.3.3 Queue 与栈类似,队列也分成顺序队列和链式队列。用单链表表示的链式队列特别适合于元素变动比较大的情形,而且不存在队列FULL而溢出的情况。另外,假若程序中需要多个队列,与多个栈的情形一样,最好使用链式队列。这样不会出现存储分配不合理的问题,也不需要考虑存储的移动。下面就给出相应的代码。 链式队列模板类代码://数据结构——链式队列模板类#includ原创 2017-10-14 21:24:10 · 1090 阅读 · 0 评论 -
数据结构——循环队列(顺序队列)模板类实现
数据结构笔记3.3 顺序队列是用顺序表实现的(即依托于数组),这里实现的是循环队列,其实也可以不用循环,但是那样的话,空间的利用效率就太低了,这就是”假溢出”问题,因为在数组的前端可能还有空闲的位置(因为队列中的数据是在动态变化的,可能出队也可能入对)。 为了能够充分利空间,所以用循环队列,即在逻辑上把数组的队结构看成一个环。具体实现:实现的方式还是十分巧妙地,运用两个指原创 2017-10-14 11:44:16 · 2269 阅读 · 0 评论 -
数据结构——链式栈模板类实现
数据结构笔记3.1.3 链式栈和前面的顺序栈是栈的两种不同实现形式,其实就是顺序表与链式表,区别在于其实现的方式(数组和指针节点),顺序栈指的是其每个节点的物理存储是连续的,因为是使用数组实现的。而链式栈存储位置则是不连续的,需要指针来穿接。 但是因为栈的操作单调,相对于单链表更容易实现,单链表相当于是一个泛泛的存储表,其操作更加任意,而像栈、队列这种数据组织结构,其只能在整个表原创 2017-10-13 20:52:48 · 1950 阅读 · 0 评论 -
数据结构——循环链表模板类
数据结构相关笔记整理(1.2) 最近数据结构进展缓慢,每个结构的代码少说都得200行,但是依旧喜欢成功运行时的成就感!这次主要整理了循环链表的模板class,新手上路难免有不当和瑕疵之处,希望群众们及时指出。下面贴出代码: class及其函数定义://循环链表模板class#include <iostream>using namespace std;template<class T>str原创 2017-09-28 22:38:08 · 1034 阅读 · 0 评论 -
单链表的运用——多项式及其运算
包括:多项式的class定义+多项式加法+多项式乘法 黄金周即将过去,好多任务都没有完成,还好提前意识到,最近两天只好奋笔疾书了! 本篇依旧是数据结构的内容,但是是单链表的一个应用实例,还是比较实用的,相信透彻理解这个多项式的应用,对数据结构单链表这一块会更好的把握。废话不多说,下面给出完整代码: 多项式class定义:#include <iostream>#include <cmath>原创 2017-10-07 10:06:22 · 4250 阅读 · 0 评论 -
数据结构——基本栈的模板类
数据结构笔记 这篇文章主要是给出栈的基本操作的代码(如: POP、PUSH等),是一个最基本的栈的模板类。#include <iostream>#include <cassert>#include "stack.h"using namespace std;const int stackIncreament = 20; //栈溢出时扩展原创 2017-10-08 16:19:22 · 560 阅读 · 0 评论 -
循环链表示例:求解约瑟夫问题
错误:Debug Assertion Failed! 今天花了好久才解决了本篇文章中的一个错误,代码bug当然是不可避免的,但是我们可以尽可能的优化他,减少他。 错误分析:主要原因是求解约瑟夫环的问题时,使用了我上一篇文章的循环单链表的模板类,但是我在实际求解中并没有用模板类中的Remove(删除)这个成员函数(不用是因为我定义的删除函数本身的局限性造成的),直接是原创 2017-09-29 21:01:04 · 676 阅读 · 0 评论 -
数据结构——基于数组的优先级队列模板类实现
数据结构笔记3.4 与普通的队列不同,优先级队列并不一定按照FIFO(先进先出)的原则对数据进行操纵,而是每次从队列取出具有最高优先权的元素。打个比方,你现在有一堆任务,而你只能一项一项的完成,一种方式是哪项任务先来的你完成哪个;另一种方式是你考虑了各项任务的轻重缓急,然后给他们各自一个优先级序号(就是执行先后次序的序号),你按照这个执行序号来完成每一项任务。这其实就好比是,两种队列的差别原创 2017-10-17 21:09:52 · 526 阅读 · 0 评论 -
离散数学中Warshall算法简析
离散数学中Warshall算法简析最近学了离散数学的图论,突然感觉离散数学的作用十分强大,相信学好离散数学中的算法,编程的魅力也不言而喻。闲话不多说,这篇博客中记录的是Warshall算法的简单解析及C++代码实现。问题引出:在一个图结构中,常常需要找两个节点之间有没有一条通路(通路长任意),也就是任意两点之间的可达情况,我们很自然会联想到用邻接矩阵来求可达矩阵,从而得出两点之间的可达情况。如:原创 2017-09-25 23:59:54 · 24511 阅读 · 1 评论 -
数据结构——双向循环链表模板类
数据结构笔记(二) 今天可是10.1呀,瞧瞧我在干什么?竟然没去大明湖,没去趵突泉……,而是在教室敲数据结构的代码。当然,最终可以把相关知识的代码写出来,并与有梦想的你一块分享、学习,意义也是蛮大的。 这篇博客主要是贴出数据结构中一个重要的模板class——双向循环链表,也会在最后提到一些写此template class时的注意点和易错点,希望自己作为前车之鉴,也希望各位指正、原创 2017-10-01 22:27:03 · 550 阅读 · 0 评论 -
数据结构——静态链表模板类实现
数据结构笔记2.6 最近总算把静态链表的模板class整理出来了,之所以耽误时间,一方面是因为……,另一方面是静态链表和普通链表在思考上还是有差别的,把无序的东西(普通链表的每个节点)联系起来,还比较自然,但是把有序的东西(静态链表的物理存储)硬生生拆分成不按照其常规顺序的总是感觉别扭,但是认真想一下,其实二者在道理上是统一的。例如,在静态链表中Insert一个节点,其实就是在空闲数组中拿原创 2017-10-13 11:36:42 · 749 阅读 · 0 评论 -
数据结构——顺序双栈模板类实现
数据结构3.1.2 顺序栈中单栈和双栈(数组的两端分别为栈底)其实极为相似,道理上是一样的,实现的时候只需要多定义一套top标记和bottom标记即可,在判断栈FULL的时候,即是判断两个top是否相遇,这里我用两个元素的数组来定义两个栈顶标记,下面贴出代码(实现方式是多种多样的,如有不当,万望指正)^ _ ^ 模板类代码:#include <iostream>#include原创 2017-10-13 13:52:25 · 953 阅读 · 0 评论 -
理解希尔排序的排序过程
1,有关插入排序(1)插入排序的基本方法是:每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。 (2)可以选择不同的方法在已经排好序的有序数据表中寻找插入位置,依据查找方法的不同,有多种插入排序方法。下面是常用的三种。 1>直接插入排序 2>折半插入排序 3>希尔排序 (3)直接插入排序基本思想:当插入第i(i>1)个元素时,前原创 2018-01-30 09:41:06 · 156057 阅读 · 31 评论