读数据结构与算法分析 不相交集合 等价关系 满足三个性质 - 自反性 - 对称性 - 传递性 基本数据结构 基本思路 使用一个数组,下标表示该集合,内容表示指向的父亲 实现 类型声明 typedef int DisjSet[NumSets + 1] ; typedef int SetType ; typedef int ElementsType ; void Intialize(DisjSet S) ; void SetUnion(DisjSet S,SetType Root1,SetType…
不相交集合数据结构保持一组不相交的动态集合S={S1,S2,...,SK},每个集合通过一个代表来识别,代表即集合中的某个成员. 如果x表示一个对象,不相交集合支持以下操作: MAKE-SET(x):建立一个新的集合,其唯一成员为x.因为各集合是不想交的,故x没有在其它集合中出现. UNION(x,y):将包含x和包含y的集合合并为一个新的集合. FIND-SET(x):返回包含x的集合. 1.不相交集合的数组表示 在一个数组中保存每个元素所在集合的名称.这样Find操作就是简单的O(1)查找.…
很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数. 首先是一些表示状态的全局变量 common.h #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERLOW -2 typedef int Status; 然后是三元组ADT的头文件,包含了三元组的函数声明 triplet.h #include "common.h" /…
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛ <数据结构题集>习题解析合辑 ★教材及习题源码下载★ 链接☛☛☛  严蔚敏<数据结构>课本与习题源码(GitHub仓库) 博主有话说: 01.自学编程,难免思路阻塞,故我在本博客陆续更新了严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了…
最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. 等价关系与等价类 从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系.若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意对象x,y, z,下列性质…
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道小题,激发读者的求知欲,培养自学能力和独立思考习惯.主教材和习题解析共计配有340多组.400余幅插图结合简练的叙述,40多张表格列举简明的规范.过程及要点,280余段代码及算法配合详尽而简洁的注释,使深奥抽象的概念和过程得以具体化且便于理解和记忆:推荐20余册经典的专著与教材,提供40余篇重点的学术论文,便…
目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 @(文章目录) 认识并查集 对于并查集(不相交集合),很多人会感到很陌生,没听过或者不是特别了解.实际上并查集是一种挺高效的数据结构.实现简单,只是所有元素统一遵从一个规律所以让办事情的效率高效起来. 对于定意义,百科上这么定义的: 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,…
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <malloc.h> typedef char InfoType;#define MAX_Info 80 // 信息字符串最大长度+1 #define MAX_VERTEX_NAME 5  // 顶点字符串最大长度+1 typedef char  VertexType[MAX_V…
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译环境:Dev-C++ 4.9.9.2*/ #include <stdio.h>#include <limits.h> // 静态链表类型 #define SIZE 100 // 静态链表容量 typedef int KeyType; // 定义关键字类型为整型 typedef int …
/* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> #define MAX_NAME 5   // 顶点字符串的最大长度+1#define MAX_INFO 20   // 相关信息字符串的最大长度+1typedef int VRType;   // 顶点关系的数据类型#define INFINITY INT_MAX // 用整型最大值代替∞#define MA…
本人的愚见,博客是自己积累对外的输出,在学习初期或自己没有多少底料的情况下,与其总结写博客不如默默去搞自己的代码,但是学到集合这一块时,数组,集合,数据结构,算法这个概念搞的我比较混淆,所以不得已写这篇东西. 一,数组,数组和集合是Java中常用到的. 用Java去创建数组: double[] myList; 这时myList 只是代表声明了一个只存放double类型的数组,并没有实体. 要想创建myList的实体,则要给它一个固定的大小,也就是说,数组存放数据的内存是一块连续的区间. myLi…
什么是不相交集合(Disjoint Sets) 是这样的一组set,任何元素最多只能在一个set中 至少支持查找Find和合并Union操作 实现方式(基于树) 每个set都是一棵树 每棵树都由树的根节点识别 合并操作只需要修改根节点的指针 合并的复杂度是O(1) 查找的复杂度是O(depth) ,树的深度 可以方便地通过指针来实现 struct item { char data; Item* parent; } 但是如果数据结构中没有指针,需要自己在外面再套一层结果,比较麻烦 还有另一种方法是…
数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ i ≤ n,1 ≤ j ≤ n,i ≠ j ),在序列前尚未序列中 Ri 领先于 Rj(即  i < j ).若在排序前后的绿鬣中 Ri 仍大于 Rj ,则称所有的排序方法为稳定的,反之为不稳定. 内部排序 待排序记录全部存放在计算机的内存中进行排序的过程. 外部排序 待排序记录数量很大,以至于内存…
目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名   变量命名规则主要有以下几条: 变量名只能包含字母.数字和下划线,其中下划线和字母可以开头,数字不行,即info_1可以,而1_info不行: 变量名内不能包含空格,可以用下划线替代,即info_1,而非info 1: 不能与Python内置关键字和函数名重名,这条在很多语言中都是一致的: 变量名中要言简意赅,即可以用nam…
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无权图,那么1代表有关系,0代表没有关系. 如果是有权图(网)那么用INT_MAX代表没有关系,使用具体的值来代表有关系. 说明 在这里,由于邻接矩阵很好实现,我试着增加难度,使用稀疏矩阵存储无向图. 完整实现: //注意:所有数组从 0 开始 #include <stdio.h> #include…
集合类型 定义 个或多个其他对象的对象.集合拥有访问对象.插入对象.删除对象.确定集合大小以及遍历或访问集合的对象的操作 分类 根据组织方式进行 线性集合 线性集合按照位置排列其项,除了第一项,每一项都有唯一的一个前驱,除了最后一项,每一项都有唯一一个后继 示意图 层次集合 层次集合中的项都拥有唯一的前驱(除了顶层的项),以及 0 个或多个后继.单个的称为根的项是没有前驱的. 示意图 图集合 图中的项拥有0 个或多个后继,以及0 个或多个前驱 示意图 无序集合 无序集合的项没有特定的顺序 示意图…
读数据结构与算法分析 表的概述 形如A1,A2,A3... 操作合集 PrintList MakeEmpty Find Insert Delete 表的简单数组实现 分析: PrintList和Find操作线性时间 Find操作常数时间 Insert和Delete操作效率低下 所以一般不用数组实现 链表的指针实现 设计思路 在内存中不必相连 每个结构包含表元素和指向该元素后继元的指针 即实现了快速Insert和Delete操作 实现代码 类型声明 struct Node typedef stru…
数据结构与算法分析 栈模型 限制插入和删除只能在表的末端的表 表的末端叫做栈顶(top) 支持Push进栈和Pop入栈操作 //LIFO后进先出表 栈的实现 链表实现 类型声明 struct Node ; typedef struct Node *PtrToNode ; typedef struct Node Stack int IsEmpty(Stack S) ; Stack CreateStack(void) ; void DisposeStack(Stack S) ; void MakeE…
Java list与Python list相比较 Java List:有序的,可重复的.(有序指的是集合中对象的顺序与添加顺序相同) Python list(列表)是有序的,可变的. Java List分类: ---ArrayList:底层使用数组,线程不安全,查找速度快,增删速度慢 在迭代过程中,对集合对象的增删会出现异常 ---LinkedList:底层使用链表,线程不安全,查找速度慢,增删速度快 后进先出,类似于栈 ---Vector:     底层使用数组,线程安全,查找速度快,增删速度…
数据结构 概念:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 算法复杂度 时间复杂度 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间.这是一个关于代表算法输入值的字符串的长度的函数.时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数.使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值…
先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题(需求)的具体的例子 算法:解决问题的过程,是对一个计算过程的严格描述 程序:程序可以看作是采用计算装置能够处理的语言描述的算法 一.算法的5大性质 有穷性(算法描述的又穷性):算法必须用有限长的描述说清楚 能行性:算法的每一步都是可行的,也就是说,每一步都能通过执行有限次数完成 确定性:别人看了过…
[1] 严格意义上数据结构的概念 数据结构,一个简单的定义:相互之间存在一种或多种特定关系的数据元素的集合.即:数据结构 = 元素集合 + 元素间关系的集合 . 在讨论数据结构时,可以基于两个不同的层次:1.逻辑层次  2.存储层次 ( 很多专业书中也写为:逻辑结构.存储结构.但为了避免概念间的混淆,我认为 “层次” 这一表述方式更贴切 ) .逻辑层次,是指对描述对象的单纯的数学抽象.例如:一个科研小组由1名导师.2名研究生和6名本科生构成,导师指导2名研究生,每个研究生分别指导3名本科生.将这…
树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术语 术语概览 示列 普通的树和二叉树 二叉树中,每个节点最多只有两个子节点,分别称为左子节点和右子节点 树的递归定义 普通的树 要么为空,要么包含一个有限的节点的集合 T.有一个和所有其他节点不同的节点r,称为根.此外,集合 T - {r}可以被划分为不相边的子集.每个子集都是一个普通的树. 二叉树…
接口 接口是软件资源用户可用的一组操作 接口中的内容是函数头和方法头,以及它们的文档 设计良好的软件系统会将接口与其实现分隔开来 多态 多态是在两个或多个类的实现中使用相同的运算符号.函数名或方法.多态函数的示例是 str 和 len.多态运算符是 + 和 ==.多态方法的示例是 add 和 isEmpty. 将接口与实现隔开的好处 降低了用户的学习难度 允许用户以即插即用的方式,快速的将资源整合起来 让用户有机会在相同资源的不同实现中做出选择 允许用户对资源的实现做出修改,而不影响用户代码 开…
本书是Ford和Topp两位教授于1996看出版的名著Data Structures with C++的第2版,在全球范围内已经有数以万计的学生从中受益.作者将C++语言作为算法描述语言,应用包含规范化的数据结构的标准模板库,集中讲述了数组.向量.表.关联树容器,以及集合.映射.堆.哈希表和图等数据结构及其算法,重点讨论了如何高效地存储大型数据集合,涵盖了数据库结构初级和高级教程撮新内容.书中各章章前提出学习目标,章后附有丰富的练习题.答案以及书面练习和上机编程练习,指导读者迅速.全面地掌握核心…
这篇博客是为了对数据结构进行一系列的学习整理,包括线性表,栈和队列,串,数组和广义表,树和二叉树,图,动态储存管理,查找,内部排序,外部排序文件进行部分笔记的记录. 基本概念和术语 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:性质相同的数据元素集合,是数据的一个子集. 数据结构:是相互之间存在一种或多重特定关系的数据元素的集合. 数据类型:是用来刻画操作…
本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 红黑树 哈希表 动态数组 API介绍 数组是一种根据下标操作的数据结构,它的查询速度很快,但是它有缺点,那就是数组的容量一旦在创建时确定,就不能进行更改,所以为了克服这一缺点,我们实现一个自己的数组,并除此以外,还会实现一些方法,包括以下 add(int index, E e) 向指定index添…
第一章 概述 1.0 序言 自己为啥要学数据结构嘞,我觉得主要有以下三个原因: 前段时间在看并发编程时,发现aqs,corrunthashmap等底层都用到了数据结构,主要的有队列,还有链表,学习数据结构有助于你更好的去看懂源码. 学习数据结构让你在编写代码时,在脑海中有一个更好的轮廓,知道自己要用什么来存储.处理数据,效率更高. 主要是最近面了一个公司,自己Java基础.多线程.redis.mq.分布式框架等都回答的可以,后面又加了一轮算法机试,因为不是科班,自己这块太薄弱了,难过呀铁子,决定…
任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一种数据结构. 认识数组和广义表 数组可以看成是一种特殊的线性表,也就是线性表中的数据元素本身也是一个线性表,数组中的个元素具有统一的类型.其实说白了就是在脑海中想数组中的数据如何在内存中以什么形式的线性表来存储.在C语言中,一个二维数组可以定义为其分量类型为一维数组类型的一维数组类型. 数组一旦被建…
马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复杂单位,可以认为一个特定算法时间性能只依赖于问题的规模(n),或者说它是一个特定算法时间性能只依赖于问题n的一个函数f(n),当问题规模n趋近于无穷大时的时间量级就称为算法的渐近时间复杂性,简称时间复杂度. 其实说白了就是看这个程序可以执行多少步,看它是否有循环,最后在把值估计计算下就是时间复杂度了…