数据结构基本知识点总结

1,

数据结构三要素:
  1,逻辑结构:线性和非线性
  2,存储结构:顺序,链式,索引,散列
  3,数据运算:算法

  具体时间复杂度与问题的规模和初始条件相关,分最佳和最大

2,

线性表:

无头结点:
  头插法:s->data=ch;s->next=head;head=s;
  尾插法:rear->next=s;rear=s; (两个指针头尾指针)
  删除:q=p->next;p->next=q->next;free(q);
有头结点:有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。

  头插法:s->data=ch;s->next=head->next;head->next=s;
  尾插法:rear->next=s;rear=s; (两个指针头尾指针)
  删除:q=p->next;p->next=q->next;free(q);
循环链表:
单循环链表中设置尾指针比设置头指针更好
双循环链表:
  前插:s->data=ch;s->prior=p->prior;s->next=p;p->prior->next=s;p->prior=s;
  删除:p->prior->next=p->next;p->next->prior=p->prior;free(p);

链表逆序:

 public static Node reversed_linkedlist() {
        MyLinkedList list = new MyLinkedList();
        Node head = list.init();

        if(head == null || head.next == null) {
            return head;
        }

        //使用三个节指针
        Node current = head;
        Node newHead = null;
        Node next = null;

        while(current != null) {
            //先将当前节点的下个节点保存
            next = current.next;

            current.next = newHead; //将原来的链表断链,将current的下一个结点指向新链表的头结点
            newHead = current; //将current设为新表头

            current = next; //将之前保存的next设为下一个节点
        }
        return newHead;
    }

3,

栈:
顺序栈:(栈顶插入和删除,栈底为0)

  •   初始栈:s->top=-1;
  •   进栈:s->top++;S->data[s->top]=x;
  •   出栈:x=S[s->top];s->top--;

链栈:链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针

  •   进栈:p->data=x;p->next=S->top;S->top=p;(先进后出)S的next指向前面
  •   出栈:S->top=p->next;free(p);

队列:

队头删除,队尾插入(银行排队)
顺序队列:
front和rear分别队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置
循环队列:为区分队列空和满:1,添加一个空;2,添加计数项

  •   入队:Q->count++;Q->data[Q->rear]=x;Q->rear=(Q->rear+1)%QueueSize;
  •   出队:Q->count--;Q->front=(Q->front+1)%QueueSize;

链式队列:

  • 入队:p->data=x;Q->rear->next=p;Q->rear=p;
  • 出队:p=Q->front;Q->front=p->next;free(p);

4,

树:
层次:根为第一层,最大层为树的高度,深度为根到该节点的路径长度;高度为叶节点到该节点最大路径
二叉树性质:
  1,二叉树第i层上的结点数目最多为2i-1(i≥1)。
  2,深度为k的二叉树至多有2^k-1个结点(k≥1)
  3,在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1
  4,具有n个结点的完全二叉树的深度为:log2[n](向下)+1或log2[n+1](向上)

二叉树存储形式:
  1,顺序存储:第i个结点的孩子是2i,2i+1 (完全二叉树适用,如果该树不是完全二叉树,需要添加空节点构成完全二叉树)
  2,二叉链表结构:左右指针,中间数据 |left|data|right|
二叉树遍历:

遍历是树进行其他运算的基础,前+中,中+后,层次+中(因为前后可以推出根结点,而中可以推左右) 使用递归思想来推树的结构能够快些
如:前+中
前:GDAFEMHZ 中:ADEFGHMZ
步骤:根据前知道root是G,根据中知道左子树是ADEF,右子树是HMZ
  分析leftTree,由前知道root是D,so leftTree is:A,and rightTree is :EF
  分析leftTree A ,结束,分析rightTree,From 前知道root 是F,From 中知leftTree is E
  分析rigthTree HMZ,From 前知root is M,From 中知 leftTree is H,and rightTree is Z
  遍历结束,树的层次遍历为 GDMAFHZE
如:中+后
中:ADEFGHMZ 后:AEFDHZMG
步骤:From 后,知道root 是G,From中知leftTree is ADEF,rightTree is HMZ;
   分析leftTree:From 后知root is D,From 中leftTree is A ,rightTree is EF;
  分析rightTree EF;From 后知:root is F,From 中leftTree is E;
  分析rightTree HMZ;From 后知root is M ,From 中leftTree is H,rightTree is Z;
  遍历结束,层次遍历为:GDMAFHZE

线索二叉树:左右标签为0,表示左右指针指向左右孩子节点,若为1,指向其左指向前驱,右指向后继(方便前,中,后遍历)
树转二叉树:二叉树左子树为树的子节点,右子树为兄弟,单个树即只有左侧,同样森林可以是左右子树的二叉树
同理二叉树转回森林和树:类似
树存储结构:
  1,双亲链表表示法利用树中每个结点的双亲唯一性,在存储结点信息的同时,为每个结点附设一个指向其双亲的指针parent,惟一地表示任何-棵树。
  2,孩子链表表示法是为树中每个结点设置一个孩子链表,并将这些结点及相应的孩子链表的头指针存放在一个向量中。类似hash
  3,在存储结点信息的同时,附加两个分别指向该结点最左孩子和右邻兄弟的指针域leftmostchild和rightsibling,即可得树的孩子兄弟链表表示。
这种存储结构的最大优点是:它和二叉树的二叉链表表示完全一样
树(森林)的前序遍历:前序遍历一棵树(森林)恰好等价于前序遍历该树(森林)对应的二叉树
后序遍历树(森林)恰好等价于中序遍历该树(森林)对应的二叉树

树的路径:树的路径长度是从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。
树的代价:结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积
带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。
哈夫曼树:
1,n个叶子的哈夫曼树要经过n-1次合并,产生n-1个新结点。最终求得的哈夫曼树中共有2n-1个结点。
2,哈夫曼树是严格的二叉树,没有度数为1的分支结点。

哈夫曼编码方式:

定长编码:如有6个字符,则n的位数定义为log26的上限为3位,定长为3位:000,001,010,011,100,101

变长编码:哈夫曼编码,根据树的深度,左子树为0,右子树为1:根:0,00,010等

用途:
编码:将每个字符编码成二进制位串
解码:将二进制位串转为字符
变长编码方案:变长编码方案将频度高的字符编码设置短,将频度低的字符编码设置较长
哈夫曼编码:压缩文件
1,构造哈夫曼树,确定每个单词所在的层次(n n=1,..),即哈夫曼二进制
2,计算代价:每个单词(叶节点)的层次(n-1)*单词出现的次数(权重值)之和为哈夫曼代价,实现压缩。

                

5,

 图G的顶点数n和边数e的关系

  若G是无向图,则0≤e≤n(n-1)/2
  若G是有向图,则0≤e≤n(n-1)
无向图的度:无向图中顶点v的度(Degree)是关联于该顶点的边的数目,记为D(v),不分出度和入度
有向图的度:入度:以顶点v为终点的边的数目称为v的入度(Indegree);出度:以顶点v为始点的边的数目
      图的边数等于度之和除以2
连通图:若V(G)中任意两个不同的顶点vi和vj都连通

有向边也称为弧(Arc),边的始点称为弧尾(Tail),终点称为弧头(Head)。
强连通图:有向图G中,若对于V(G)中任意两个不同的顶点vi和vj,都存在从vi到vj以及从vj到vi的路径,则称G是强连通图。
若将图的每条边都赋上一个权,则称这种带权图为网络
图邻接矩阵:时间复杂度O(n^2)

图邻接表:时间复杂度O(n+e)

表结点结构:邻接点域adjvex:存放与vi相邻接的顶点vj的序号j。链域next:将邻接表的所有表结点链在一起
头结点结构:顶点域vertex:存放顶点vi的信息;指针域firstedge:vi的邻接表的头指针
有向图分为:出边表和入边表

        

图遍历:

              

深度遍历:

使用栈,时间复杂度为O(n^2)(邻接矩阵)O(n+e)(邻接表)

上图的深度遍历: v0,v1,v2,v5,v4,v6,v3,v7

广度遍历:
使用队列:先进先出 时间复杂度为O(n^2)(邻接矩阵)O(n+e)(邻接表)

上图广度遍历是:V0,V1,V3,V4,V2,V6,V5,V7

生成树:
连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树 (最小连通子图)
最小生成树:针对带权的网络,计算出整个网络通信所需要的最小成本
普利姆算法(prim):时间复杂度O(n^2),与图的边数无关,适合稠密图
流程初始顶点,选择其邻居中最小的边,更新邻居的边集,依次进行,直到所有顶点加入到生成树中

克鲁斯卡尔(Kruskal)算法:时间复杂度O(elge),适合稀疏图
流程:提取边的集合;找权值最小的边,寻找下一条边(如果该边使图变为环,舍去),直到全部顶点变为生成树时,结束

最短路径:

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。O(N^2)  不能计算权重为负,适合有向图计算如:

Floyd算法:是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。核心检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,流程具体如下:

2阶矩阵求法:从横竖交处为起始点a[0][0],选横线某点i为a[0][1]点,a[1][1]选i列不在斜线上的第j行的点, a[1][0]选取竖线上的第j行的点。判断方法:如果a[0][0]+a[0][1]+a[1][0]<a[1][1],则用相加值替代原先A[i][j]上的值。n行n列一次可以得到(n-1)*(n-2)各小矩阵,总共更新n次,获取到每个点之间的最短路径。

矩阵A3为最后结果每个点到其它点的最短路径,矩阵Path记录u,v两点之间最短路径所必须经过的点-------------------》参考博客网站

最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。
最短路径是从一点出发,到达目的地的路径最小。(注意最小生成树prim和dijiksd算法不同)

拓扑排序:针对有向无环图,表示事件发生的先后顺序

参考网址和练习题:http://xu-laoshi.cn/shujujiegou/xiti_07_1.html

时间: 2024-10-02 22:25:35

数据结构基本知识点总结的相关文章

数据结构基础知识点总结

1.数据就是指能够被计算机识别.存储和加工处理的信息的载体. 2.数据元素是数据的基本单位,可以由若干个数据项组成. 3.数据项是具有独立含义的最小标识单位. 4.数据结构的定义: (1)逻辑结构:从逻辑结构上描述数据,独立于计算机. (2)线性结构:一对一关系. ·线性结构:多对多关系. (3)存储结构:是逻辑结构用计算机语言的实现. (4)顺序存储结构:如数组. (5)链式存储结构:如链表. (6)索引存储结构: 稠密索引:每个结点都有索引项. 稀疏索引:每组结点都有索引项. (7)散列存储

数据结构,知识点

二叉树: 定义:二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根节点的度不大于2. 基本概念:二叉树是递归定义的,其结点有左右之分,逻辑上二叉树有五种基本形态: 1>空二叉树: 2>只有一个根节点的二叉树: 3>只有左子树: 4>只有右子树: 5>完全二叉树. 尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形. 树: 定义: 1.树是元素的集合: 2.该集合可以为空.这种树中没有元素,我们称树为空树: 3.如果该集合

数据结构二叉树知识点总结

术语 1. 节点的度:一个节点含有的子树的个数称为该节点的度: 2. 叶节点或终端节点:度为零的节点: 3. 非终端节点或分支节点:度不为零的节点: 4. 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点: 5. 兄弟节点:具有相同父节点的节点互称为兄弟节点: 6. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推: 7. 树的高度或深度:树中节点的最大层次: 8. 堂兄弟节点:父节点在同一层的节点互为堂兄弟: 9. 节点的祖先:从根到该节点所经分支上的

复习数据结构:排序(一)——插入排序

从这一篇开始,我开始复习数据结构的知识点,博文主要偏重于每个知识点的核心思想,以及代码实现.这一篇先从排序算法中的插入排序开始. 稳定排序.内排序.适合少量数据量的排序. 当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2). 当输入数组倒序排列时,插入排序时复为:O(n^2). 平均时间复杂度:O(n^2). 插入排序的基本做法是:将一个数插入到一个已经排列好的数组中,通过移动这个数的位置,使得插入之后的数组也是有序的,不断重复这个过程,使得最终所有的数都是有序的. 实现代码如下

【自考】数据结构之二叉树遍历

什么是数据结构? 首先看看维基百科的定义:在计算机科学或信息科学中,数据结构(英语:data structure)是计算机中存储.组织数据的方式.通常情况下,精心选择的数据结构可以带来最优效率的算法. 课本中的定义:指一组相互之间存在一种或多种特定关系的数据的组织方式和它们在计算机中的存储方式,以及定义在该组数据上的一组操作. 有哪些内容?    直接看图了解数据结构的知识点,如下: 不管是算法还是逻辑结构,都是用数据说话的,所以要先明白了数据的基本概念.大的联系图中已给出,小的知识点需要我们去

高级数据结构:优先队列、图、前缀树、分段树以及树状数组详解

优秀的算法往往取决于你采用哪种数据结构,除了常规数据结构,日常更多也会遇到高级的数据结构,实现要比那些常用的数据结构要复杂得多,这些高级的数据结构能够让你在处理一些复杂问题的过程中多拥有一把利器.同时,掌握好它们的性质以及所适用的场合,在分析问题的时候回归本质,很多题目都能迎刃而解了. 这篇文章将重点介绍几种高级的数据结构,它们是:优先队列.图.前缀树.分段树以及树状数组. 一.优先队列 1.优先队列的作用 优先队列最大的作用是能保证每次取出的元素都是队列中优先级别最高的,这个优先级别可以是自定

回学校前的计划

现在一天usaco能刷5~7道,现在刚到3.3,还有第三章8题,第四章11题,第五章14题,第六章17题,总共50题.如果一天5道,回学校前应该能刷完,但这样的训练强度根本不够! 13 4 5 6 7 8 9 20 1 2 3 因此今天开始要增加训练强度!!! 首先是usaco,只放在早上刷,而且必须保持7道以上的题量. 接着下午一套codeforces的div1,然后迅速补题,至少补到C,尽量补到E,为了方便,就从#129(div1)开始,目标就是在回学校前刷完第四页至少一半的div1,每套d

JDK1.8源码分析之HashMap(一)

一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的情况下让其速度更快,提升性能.好~下面就开始分析源码. 二.HashMap数据结构 说明:上图很形象的展示了HashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树的引入是为了提高效率.所以可见

.NET CoreCLR开发人员指南(上)

1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所有的CLR开发者都尽量能在较少知识的情况下,去了解CLR中自己工作的那一部分内容.这篇文章将会为你呈现CLR的发展史,以及不同阶段解决的不同问题和不同阶段解决问题以后给开发者带来的一些更加便利的东西. 1.1代码规范 这是最为重要的一个章节!设想一下本文的目录里面的一些项,然后想想自己该如何设计代码