数据结构
文章平均质量分 91
数据结构学习笔记。
LauZyHou
Microsoft Software Development Engineer
展开
-
【数据结构学习笔记】18:线段树(建树、单点修改、区间查询)
单点modify的线段树,不带懒标记push down原创 2022-11-26 03:33:33 · 963 阅读 · 1 评论 -
【数据结构学习笔记】17:模拟散列表
哈希表通过空间换时间的方式,能够实现平均在O(1)O(1)O(1)的时间里插入和删除元素,它能够将较大的空间的数据映射到一个小范围里。手写哈希表的时候,哈希函数一般就是将数值关键字对一个数取模,由于取模的结果就是000到这个数,所以这个模数其实就是数组哈希表的长度NNN,取模结果对应到数组模拟哈希表中从零开始的一个下标。为了处理数值关键字是负数的情况,xxx对NNN的取模运算(计算哈希值kkk)是:k=(x%N+N)%Nk = (x \% N + N) \% Nk=(x%N+N)%N在这种方式中,原创 2021-02-05 21:16:07 · 285 阅读 · 0 评论 -
【数据结构学习笔记】16:模拟堆与堆排序
1 简述1.1 堆的性质与操作大根堆(小根堆)是一棵完全二叉树,其性质是每一个结点都是≥\geq≥(≤\leq≤)左右儿子结点的,因此满足每棵子树都是一个大根堆(小根堆)。特别要注意这里加粗的地方才是根本性质,即大根堆每个结点≥\geq≥左右儿子,小根堆每个结点≤\leq≤左右儿子,绝对不是“最大(最小)元素在根节点”这种导出性质。由于这个特性的存在,堆顶元素就是整个大根堆(小根堆)中的最大(最小)元素,可以快速取出。朴素的堆至少要支持:获取堆顶元素取出堆顶元素,然后在log(n)log原创 2021-02-05 00:58:24 · 320 阅读 · 0 评论 -
【数据结构学习笔记】15:并查集
1 简述并查集可以用来描述集合,能够做集合合并操作,检查两个元素是否属于同一个集合等。并查集用森林中的每棵多叉树来表达一个集合,初始时,每个元素单独在一个集合,也就是自己是一棵树:合并两个集合时,只要把一个集合的树根挂到另一个集合的根上。例如,合并元素111所在的集合和元素222所在的集合(图中以黄色结点为树根,绿色为非根):以一个更加一般的例子来说明合并的过程,例如这样两棵树(代表两个集合):合并时,把一棵树的树根挂到另一棵树上:并查集几乎都是用树的数组表示来实现,用一个int型数组p原创 2021-02-04 22:29:50 · 271 阅读 · 0 评论 -
【数据结构学习笔记】14:Trie树
1 简述Trie树是能够高效存储和查找字符串集合的数据结构,比较适合字符种类较少的问题,例如如果字符串中只可能出现262626种小写字符,那么Trie树长成这样:也就是说Trie树的树根是一个虚拟结点,然后它会分叉出262626个结点,分别对应每个小写字母,每个结点又分叉出262626个结点,这样往下不断展开。这样看起来Trie树的空间是指数级别的,非常大,但是实际上Trie树一开始只需要有一个虚拟的根节点,然后每次插入字符串只需要把字符串上的每个字符对应的结点创建好就行了,实际的空间占用很小。例原创 2021-02-04 16:35:14 · 177 阅读 · 0 评论 -
【数据结构学习笔记】13:模拟栈与模拟队列
这节学习用数组模拟栈和队列,这种方法相比内置的栈和队列,一方面比较通用,不受语言限制,另一方面速度也比较快。而且因为是用数组模拟的,所以可以对任意位置进行修改(如果有办法知道要修改的位置的下标的话)。1 模拟栈模拟栈比较简单, 将数组的扩展方向作为栈的入栈扩展方向,并记录一下栈中的元素数量(其实也就是当前栈顶的位置),每次入栈的时候,先将栈顶位置+1+1+1,然后在这个位置填入要入栈的数据即可。需要注意数组的长度至少需要开到栈最大容量+1+1+1的大小,因为000位置是不存数据的,用来标识栈是否是空的原创 2021-02-03 20:11:22 · 277 阅读 · 0 评论 -
【数据结构学习笔记】12:静态单链表与静态双链表
链表可以用指针+结构体的实现方式,也可以用数组模拟,也就是静态链表。相比之下静态链表的效率比较高,因为指针+结构体的方式,每次创建一个新的结点的时候都要new一块结点空间,这个操作是比较耗时的。1 静态单链表静态单链表用的最多的地方就是在邻接表的链的实现上,因为邻接表实际上就是若干个单链表,邻接表用的最多的就是存储树和图。所以涉及树和图的问题的时候,如果需要读入数据存到邻接表里,就需要这部分知识了。在单链表里,每个结点都要存一个值valvalval和指向下一个结点的nextnextnext指针,然后有原创 2021-02-03 13:43:56 · 410 阅读 · 0 评论 -
【数据结构学习笔记】11:树状数组
树状数组,也叫Binary Indexed Tree(很多国内资料翻译成二叉索引树,但是树状数组显然不是二叉的),主要应用在一定规模地同时存在这两个问题的场景下:求数组中某个区间的和修改数组中的某一个数使用树状数组做这两个操作的时间复杂度都是O(logn)O(logn)O(logn)的。想一下和已经学过的做法的比较,对于上面两种操作。一个做法是直接用数组来存每一个数,那么求区间和的操作时间复杂度是O(n)O(n)O(n)的,修改数组中的某一个数的时间复杂度是O(1)O(1)O(1)的。另一个做法原创 2021-01-02 22:10:18 · 281 阅读 · 0 评论 -
【数据结构学习笔记】10:三个最短路径算法注解
Dijkstra①迪杰斯特拉算法:用于求弧上权值非负的单源点最短路径问题。用开辟好的数组dist[]和path[]分别记录到未完成点的当前最短和当前前驱。在循环中做三件事:①查:查找未完成点中哪个的路径最短,即为本次循环找出的最短路径,找这个路径终点u;②杀:将这个点u的tag域设为已访问,即到这个点的最短路径已经找出了;③改:对剩下的所有未完成点v,看这个刚完成的点u到它们的直接长度+原点到...原创 2017-05-29 16:55:32 · 1549 阅读 · 0 评论 -
【数据结构学习笔记】9:两个最小生成树算法注解
生成树是图的极小连通子图(遍历中的每一个点从始点出发只能通过一条路径到达,而没有包括那些不必要的边)。最小生成树是使得各边上的权值总和达到最小的生成树。Kruskal克鲁斯卡尔算法(属贪心法):先将所有的结点分别放到一个集合中,将所有的边按权构成最小堆,每次从堆顶取一条边,如果所连的两个结点不在一个集合中,就选择这条边,并将这两个点放入一个集合中。直到选择的边数等于顶点数-1时算法结束...原创 2017-05-29 13:56:19 · 899 阅读 · 0 评论 -
【数据学习结构笔记】8:并查集:并时加权/查后折叠
并查集可以看成一个多棵树组成的森林,它用双亲表示数组来存储。属同一棵树的元素属于同一等价类。加权规则:在合并(Union())时小树挂在大树上,以避免树结构的过度退化。折叠规则:在查找(Find())后将所查元素的路径上的所有元素回序挂在树根上,以改善树的性能,减少以后查找所需的时间。树的双亲表示数组节点类ElemNode.h//树的双亲表示数组的节点struct ElemNo...原创 2017-05-27 20:46:33 · 988 阅读 · 1 评论 -
【数据结构学习笔记】7:非递归快速排序
快速排序,分而治之。在同为O(N*logN)的几种排序方法中效率较高。递归和非递归的快排#ifndef __QUICK_SORT_H__#define __QUICK_SORT_H__#include "Assistance.h" // 辅助软件包#include <queue>template <class ElemType>void Quic...原创 2017-05-25 00:39:15 · 882 阅读 · 0 评论 -
【数据结构学习笔记】6:无向图的邻接多重表存储结构
邻接多重表的实现。这次研讨确实有难度,除了实现这个还要完成最小生成树。直接上代码吧。边节点Arc.h#ifndef ARC_H#define ARC_H#ifndef NULL#define NULL 0#endifstruct Arc{ bool tag; int weight; int adjVex1, adjVex2; Arc* nextArc1; A...原创 2017-04-30 20:45:13 · 2595 阅读 · 0 评论 -
【数据结构学习笔记】5:图的邻接表结构下求无向图的连通分量
对于图的邻接表存储结构,有以下数据成员: int vexNum, vexMaxNum, arcNum; // 顶点数目、允许的顶点最大数目和边数 AdjListNetWorkVex<ElemType, WeightType> *vexTable; // 顶点表 mutable Status *tag; // 标志数组 WeightTy...原创 2017-04-12 22:47:06 · 3620 阅读 · 0 评论 -
【数据学习结构笔记】4:非递归实现深度优先搜索(DFS)
图的遍历是通过此节点相邻的节点去访问其它节点,最终将整个图无重复地访问完。对于非连通图,从一个点搜索只是搜索完这个点所在的极大连通子图,而遍历指的却是将整个图都访问完。深度优先搜索(DFS)有点类似于树的前根序遍历,是从图的某一顶点开始搜索,被搜索过的顶点就标上已经访问的记号(由于此方法会造成无限循环,所以必须加入一个变量判断该点是否已经访问完毕),接着访问此定点的所有相邻且未被访问的一个...原创 2017-04-09 13:38:20 · 1417 阅读 · 0 评论 -
【数据结构学习笔记】3:无向图的邻接矩阵存储结构
这学期学了图,感觉图论在很多问题上都有非常精妙的应用。邻接矩阵作为无向图的存储结构,实现起来是最简易的。实际上很多时候,并不会直接采用邻接矩阵去做什么,但是在后面学习其它存储结构的时候就会发现,因为邻接矩阵的简洁明快,更多地是用它去作为一个初始化的工具,用来为其它结构存储的图进行初始化。在这种存储结构上,对数据节点本身单独打表,用一维数组vertexes[]存储节点信息,用二维数组arcs[]...原创 2017-04-09 12:01:56 · 9468 阅读 · 1 评论 -
【数据结构学习笔记】2:基于树去建立森林的孩子-兄弟结构
实现森林是这学期研讨1的内容,思路上不算复杂,实际操作起来发现原来自己已经很久没写C++了,非常手生,不过还是很快的完成了。但是发现自己对C++类的访问情况、友元、静态成员等概念已经非常生疏了,需要抽空补救一下。设计要求仿照树的孩子兄弟表示法,设计森林的孩子兄弟存储结构。要求实现森林的先根、中根、后根遍历,能求森林的规模(森林中树的数目)、森林的高度(森林中树的最大高度)、森林的叶子数(森...原创 2017-04-08 16:35:17 · 2129 阅读 · 0 评论 -
【数据结构学习笔记】1:树和森林,并查集中的部分函数
[1]在树的孩子兄弟链表模板类中增加下列函数成员,并验证(1)在孩子兄弟链表模板类中增加函数成员PostRootOrder(),实现树的后根遍历。template <class ElemType>void ChildSiblingTree<ElemType>::PostRootOrder(ChildSiblingTreeNode<ElemType> ...原创 2017-03-31 11:42:47 · 1169 阅读 · 2 评论