
数据结构笔记
文章平均质量分 63
ZXG20000
这个作者很懒,什么都没留下…
展开
-
5.5 二叉树的遍历
1. 递归遍历//先序遍历template <typename T, typename VST> void travPre(BinNodePosi(T) x, VST& visit) { if( !x ) return; //BinNodePosi(T) x = root(); visit( x->data ); travPre( x->lc, visit ); travPre( x->rc, visit );}//后序遍历template &l原创 2021-04-15 16:59:15 · 156 阅读 · 0 评论 -
12.1 排序算法
转载:https://blog.youkuaiyun.com/weixin_41698717/article/details/108147001转载 2021-03-20 23:13:17 · 152 阅读 · 0 评论 -
11.1 串
转载自:https://blog.youkuaiyun.com/weixin_41698717/article/details/107863356参考博客: 从头到尾彻底理解KMP(2014年8月22日版)1 串匹配概述字符串匹配有多种形式,包括模式检测( pattern detection),模式定位(pattern location),模式计数(pattern counting),模式枚举(pattern enumration)。2 蛮力算法蛮力算法是最直接最直觉的方法,可以作为改进的基础。2.1 蛮力转载 2021-03-20 23:11:40 · 195 阅读 · 0 评论 -
10.3 左式堆
参考博客: https://blog.youkuaiyun.com/weixin_416987 17/article/details/107789354参考博客: https://blog.youkuaiyun.com/zxhio/article/details/61195042本章问题1.左式堆有什么性质特点空节点路径长度: npl(null path length)。npl(x)既等于x到外部节点的最近距离,同时也等于以x为根的最大满子树的高度。左式堆:对于堆中每一个节点X,左儿子的零路径长至少与右儿子的零路径长一样原创 2021-03-20 22:01:52 · 361 阅读 · 0 评论 -
10.2 堆
参考博客: https://blog.youkuaiyun.com/weixin_41698717/article/details/107789354本章问题1.完全二叉堆的堆序性是什么堆序性:堆顶之外的每个节点都不大于其父节点。2.完全二叉堆中的上滤是如何操作的对第i 个词条进行上滤,查看该节点的父亲是否小于该节点,1.如果小于该节点,与父节点交换,然后对父节点位置进行上滤2.如果大于该节点,结束上滤, 并返回上滤最终抵达的位置3.完全二叉堆的插入中是如何查找插入位置的将词条插入末尾位置,然后对该原创 2021-03-20 14:31:23 · 181 阅读 · 0 评论 -
10.1 优先级队列
10.1.1 PQ的ADT接口操作结构功能描述size( )报告优先级队列的规模,即其中词条的总数insert( )将指定词条插入优先级队列getMax( )返回优先级最大的词条delMax( )删除优先级最大的词条//"pq.h"#pragma oncetemplate <typename T> struct PQ { //优先级队列PQ模板类 virtual void insert ( T ) = 0; //按照比较器确定的优原创 2021-03-16 11:15:12 · 133 阅读 · 0 评论 -
9.3 HashTable(散列表)
参考博客:什么是散列表(HashTable)参考博客:散列表参考博客:BitMap参考博客:散列表概念本章问题1.什么是散列表,和桶排序的关系是什么关系,都借助桶来快速查询,散列表(Hashtable),是根据键(Key)而直接访问在内存存储位置的数据结构2.Bitmap位图是什么位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大原创 2021-03-16 10:00:22 · 386 阅读 · 0 评论 -
9.2 (Skiplist)跳转表 c++实现
参考博客:skiplist 跳转表基本概念参考博客:跳转表本章问题1.什么是跳转表跳转表是一个基于列表list的数据结构,从结构上来说,它是由多个列表组成的。各个列表在纵向形成多层,其中第一层(最底层)拥有跳转表中的所有数据节点,以上各层列表中的数据都是其底层列表的一个子集,特别地,最顶层的列表不包含任何数据,仅含有两个头尾哨兵。跳转表的结构如图所示:跳转表的初衷在于,相对于二叉树更加直观简便。它是一种基于链表的结构,不同之处在于,节点需要包含上下左右四个方向的指针,查询和动态操作仅需要O(log转载 2021-03-14 16:18:13 · 626 阅读 · 0 评论 -
9.1 词典
本章问题1.词典的定义是什么词典,顾名思义,就是通过关键码来查询的结构。二叉搜索树也可以作为词典,不过各种BST,如AVL树、B-树、红黑树、伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度。在词典中,key和value的地位相同,支持新的循值访问(call by value)的方式。因为词典的访问不再强调关键码的大小次序,因此不属于CBA式算法的范畴,因而算法的复杂度可以突破CBA算法的界限。循值访问要求在词典的内部,数据对象的数值和物理地址建立某种关联。当然,算法时间复原创 2021-03-14 00:22:36 · 278 阅读 · 0 评论 -
8.4 kd树
kd树和knn算法的c语言实现 基于kd树的knn的实现原理可以参考文末的链接,都是一些好文章。这里参考了别人的代码。用c语言写的包括kd树的构建与查找k近邻的程序。#include<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>typedef struct{//数据维度 double x; double y;}data_struct;typedef转载 2021-03-13 22:37:35 · 137 阅读 · 0 评论 -
8.3 红黑树
参考博客:https://blog.youkuaiyun.com/weixin_41698717/article/details/107663202参考博客:https://blog.youkuaiyun.com/amoscykl/article/details/81607530参考博客:https://blog.youkuaiyun.com/sadzyf/article/details/102579851参考博客:https://blog.youkuaiyun.com/weixin_40623736/article/details/1070083原创 2021-03-06 23:54:33 · 592 阅读 · 0 评论 -
8.2 B-树
参考博客:https://blog.youkuaiyun.com/weixin_41698717/article/details/107663202参考博客:https://blog.youkuaiyun.com/amoscykl/article/details/81592543参考博客:https://blog.youkuaiyun.com/qq_34645958/article/details/80863755参考博客:https://blog.youkuaiyun.com/i6223671/article/details/86761107本原创 2021-03-04 22:31:14 · 874 阅读 · 1 评论 -
2.1 Vector(向量)
2.1.1 向量 ADT接口作为一种抽象的向量类型,向量对象应支持如下操作接口操作接口功能适用对象size()报告向量当前的规模向量get(r )获取秩为r的元素向量put(r,e)用e替换秩为r 的元素数值向量insert(r,e)e作为秩为r的元素插入,原后继元素依次后移向量remove(r )删除秩为r的元素,返回该元素中原存放的对象向量disordered()判断所有元素是否已按非降序排列向量sort()调整各元原创 2021-03-04 13:08:52 · 425 阅读 · 2 评论 -
8.1 Splay树
参考博客: https://blog.youkuaiyun.com/hellochenlu/article/details/53022709参考博客: https://blog.youkuaiyun.com/amoscykl/article/details/81589827本章问题1.splay逐层伸展到根和双层伸展有什么区别呢?假设节点的个数为n,则旋转操作的总次数的为(n-1)+{(n-1)+(n-2)+(n-3)+…+1}=(n2+n-2)/2=Ω\OmegaΩ(n2)逐层伸展,对于规模为任意n的伸展树,只原创 2021-03-02 12:57:19 · 208 阅读 · 0 评论 -
7.2 AVL树
参考博客:https://blog.youkuaiyun.com/zfliu96/article/details/88538645参考博客:https://blog.youkuaiyun.com/weixin_41698717/article/details/107613262本章问题1.AVL树的基础操作有哪些操作功能zig 旋转-顺时针旋转实现等价前提下的局部拓扑调整zag旋转-逆时针旋转实现等价前提下的局部拓扑调整注意:在下列图片之中,圆圈表示的节点,矩形表示的子树zig旋转 -原创 2021-03-01 15:30:52 · 239 阅读 · 0 评论 -
7.1 二叉搜索树
本章问题1.中序遍历的一般形式是什么?void InOrder(BiTree T){ if(T){ InOrder(T->lchild);//访问左子树 cout<<T->data<<" ";//输出该节点的数据 InOrder(T->rchild);//访问右子树 }}先左儿子底部,然后父节点,然后右儿子的左子树底部,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hRZUy5rz-161399342635原创 2021-02-22 19:30:53 · 366 阅读 · 0 评论 -
5.4 二叉树的前驱和后继
转载:https://blog.youkuaiyun.com/xiaokang06/article/details/22092051二叉树遍历的递归算法和非递归算法我们当然应该很熟悉了,不过还有另外一种遍历方式,就是增加了树的构造,然后不允许递归或是用到栈进行遍历,如线索树或者是有父母节点的二叉树等等等等。这样的遍历就需要我们找到一个节点的后继,同样如果有更变态的题要求我们找一个节点的前驱,也和找后继是一个类型,下面我就关于三种遍历方法的前驱和后继作一讨论和总结,让大家在考试的时候得心应手。也请高手给与指正原创 2021-02-20 17:12:26 · 4557 阅读 · 2 评论 -
6.2 图的应用
6.2.1 BFS 广度优先搜索template<typename Tv, typename Te> void graph<Tv, Te>::BFS(int v, int& clock) //遍历单个{ queue<int> Q; //顶点缓存队列 status(v) = DISCOVERED; //标记顶点为已发现 Q.enqueue(v); //将当前顶点入队 while (!Q.empty()) //只要队列非空,则继续 {原创 2021-02-18 23:49:29 · 150 阅读 · 1 评论 -
6.1 Graph(图)
6.1 Graph(图)6.1.1 ADT接口操作接口功能描述操作接口功能描述e( )边总数n( )顶点总数exist(v,u)判断联边(v,u)是否存在insert(v )在顶点集V中插入新的顶点vinsert(v,u)引入顶点v到u的联边remove(v )将顶点v从顶点集中删除remove(v,u)删除从顶点v到u的联边inDegreee( )outDegree( )顶点的入度和出度type(v,u)边在遍历树中所属的类型原创 2021-02-18 23:48:39 · 452 阅读 · 0 评论 -
2.3 Bitmap()位图
参考:https://blog.youkuaiyun.com/qq_18108083/article/details/85063072实现位图并封装在bitmap类中。操作功能对象bitmap(int n = 8)构造函数,默认容量为8位位图bitmap(char* file, int n = 8)构造函数,从指定文件中读取比特图位图~bitmap()析构函数,释放位图空间位图init(int n)初始化位图空间位图set(int k)置位第k个标志位原创 2021-02-08 23:51:31 · 213 阅读 · 0 评论 -
5.3 二叉树的重构
5.3 二叉树的重构目录5.3.1知后序遍历和中序遍历求前序遍历5.3.1知后序遍历和中序遍历求前序遍历首先,一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D)。因为题目求先序,意味着要不断找根。那么我们来看这道题方法:(示例)中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B;那么我们找到中序遍历中的B,由这种遍历的性质,可将中序遍历分为ACGD和HZKX两棵子树,那么对应可找到后序遍历CDGA和HXKZ(从头找即可)从而问题就变成求1.中序遍历A原创 2021-02-08 22:46:08 · 172 阅读 · 0 评论 -
5.2 BinTree(二叉树)
5.2.1BinTree-模板类#include "binnode.h"#include "release.h"#include <iostream>#include <memory>#include "Queue.h"#define max(a,b) ( a > b ? a : b)template <typename T> class BinTree{protected: int _size;//规模 virtual int updat原创 2021-02-08 18:37:36 · 358 阅读 · 0 评论 -
5.1 BinNode二叉树节点
BinNode二叉树节点5.1.1BinNode-模板类#include<iostream>#define BinNodePosi(T) BinNode<T>* //节点位置#define stature(p) ((p)?(p)->height:-1)//节点高度,与空树高度为-1的约定相互统一typedef enum{RB_RED,RB_BLACK} RBColor;//节点颜色template <typename T>struct BinNode原创 2021-02-07 19:13:10 · 925 阅读 · 0 评论 -
4.3 Queue(队列)
4.3 Queue(队列)4.3.1 ADT接口操作功能size()报告队列的规模empty()判断队列是否为空enqueue(e)将e插入队尾dequeue()删除队首对象front()引入队首对象4.3.2 Queue模板类#include"List.h"#include<iostream>using namespace std;template <typename T> class Queue原创 2021-02-06 20:22:24 · 182 阅读 · 0 评论 -
4.2 求值算法 RPN逆波兰表达式
求值算法,来自邓俊辉老师的数据结构基于Stack的类模板,处理中缀表达式求值,和将中缀表达式转转换成后缀表达式#include "Stack.h"//基于之前写的类模板Vector#include<cstdio>#include<ctype.h>#include<cstring>#include<cmath>#include"Stack.h"using namespace std;#define N_OPTR 9 //运算符总数type原创 2021-02-04 23:40:20 · 560 阅读 · 0 评论 -
4.1 Stack(栈)
出现的问题 参考的一些博客c++模板类在继承中子类无法访问父类的成员的问题解答: this访问即可,也可以直接在成员前加基类的名字Base::4.1.1 stack的ADT接口操作接口功能size()报告栈的规模empty()判断栈是否为空push(e )将e插入至栈顶pop( )删除栈顶元素top( )引用栈顶元素4.1.2 stack模板类基于向量的类模板#include "Vector.h"//基于之前写的类模板Vectorte原创 2021-02-04 23:38:25 · 272 阅读 · 0 评论 -
3.1 List(列表)
3.1.1 ListNode(列表节点)3.1.1.1 列表节点ADT接口操作接口功能data()当前所存节点的数据对象pred()当前节点前驱节点的位置succ()当前节点后继节点的位置insertAsPred()插入前驱节点,存入被引用的对象e,返回新节点的位置insertAsSucc()插入后继节点,存入被引用的对象e,返回新节点的位置3.1.1.2 ListNode模板类typedef int Rank;//秩#define Lis原创 2021-01-19 18:20:45 · 241 阅读 · 0 评论 -
2.1Vector(向量)
2.1.1 向量 ADT接口作为一种抽象的向量类型,向量对象应支持如下操作接口操作接口功能适用对象size()报告向量当前的规模向量get(r )获取秩为r的元素向量put(r,e)用e替换秩为r 的元素数值向量insert(r,e)e作为秩为r的元素插入,原后继元素依次后移向量remove(r )删除秩为r的元素,返回该元素中原存放的对象向量disordered()判断所有元素是否已按非降序排列向量sort()调整各元原创 2021-01-17 00:04:19 · 396 阅读 · 0 评论 -
1.2递归
1.2.1线性递归实例-数组求和int sum(int A[],int n){ if(1>n){//平凡情况,递归基 return 0;//直接计算(非递归式子) } else{//一般情况 return sum(A,n-1)+A[n-1];//递归前n-1之项和,再累计计算n-1项 }}//O(1)*递归深度 =O(1)*(n+1)=O(n)线性递归sum算法可能朝着更深一层进行自我调用,且每一递归实例对自身的调用至多一次。原创 2021-01-12 23:17:01 · 186 阅读 · 0 评论 -
1.1复杂度度量
1.1复杂度度量1.渐进复杂度1.大OOO记号-渐进上界当n足够大之后若存在正常数c和函数f(n),使得对任意任意 n >> 2(远远大于2),都有T(n)<=c*f(n);则可以认为n在足够大之后,f(n)给出了T(n)增长速度的一个渐进上界。此时,记之为T(n)=O(f(n))由这一定义,可以导出大OOO记号的一下性质:对于任意常数c>0 ,有O(f(n))=O(c*F(n))对于任意常数a>b>0, 有O(nan^ana+nbn^bnb)=O(n原创 2021-01-12 17:45:17 · 406 阅读 · 0 评论