你不知道的数据结构

数据结构:数据之间的逻辑结构,数据的存储结构,数据的算法。

数据的逻辑结构:

  1. 集合(无逻辑关系)
  1. 线性结构(线性表):一维数组,队列,栈
  1. 非线性结构:树,图,多维数组

数据的存储结构

  1. 顺序存储结构

线性表:顺序表和链式表

  1. 链式存储结构
  2. 索引存储结构
  3. 散列存储结构

 

按存储结构划分

  1. 线性表
    1. 顺序表(顺序存储)
    2. 链表(链式存储)
      1. 单链表
      2. 循环链表
      3. 双链表
    1. 栈:先进后出
    2. 队列:先进先出
      1. 循环队列
        1. 当队尾指针+1=队首指针的时候,队满
        2. 当队首指针和队尾指针相等的时候,队空
  1. 树和二叉树
    1. 定义
      1. 结点的度:当前结点有几个子结点,它的度就是几
      1. 树的度:当前树中最大的结点的度,就是树的度 3
      1. 叶子结点:没有子结点的结点称为叶子结点。3,5,6,7,9,10
      1. 分支结点:除叶子结点之外的节点,其余都是分支结点,有分支的结点,都是分支结点。叶子结点和分支结点是互补的。
      1. 父结点,子结点,兄弟结点,三者是相对的量
      1. 层次:从高到低层次依次为0依次增长。
    1. 树的遍历
      1. 前序遍历:父结点,从左向右访问子结点,只要有子结点,就从左向右访问子结点,然后从左向右访问兄弟结点
      2. 后序遍历:从左向右访问叶子结点,只要有叶子结点,就不访问,父结点,然后访问兄弟结点
      3. 层次遍历:从高层向底层从左向右访问
    1. 二叉树
      1. 满二叉树:除去最后一层的叶子结点,其余都有两个叶子结点。
      1. 完全二叉树:除去最后一层的叶子结点,则为完全二叉树,从01开始按层次遍历二叉树,数值是连续的,从左至右是连续排列的。
    1. 图与树的对比
      1. :父结点能与下边的很多结点相连,但是下一层的结点只能与上一层的一个结点相连
      2. :图的下一层结点能与上一层的许多结点相连
    1. G的构成表示 G=(V,E)
      1. 有向图,线带箭头;无向图,线不带箭头
        1. 顶点集合V(G)
        1. 边集合E(G)
      1. 有向图中<1,2><2,1>是不同的,无向图中(1,2)和(2,1)是相同的
    1. 顶点的度
      1. 无向图中:与此顶点相连的线的条数
      2. 有向图中:
        1. 入度:指向此顶点的箭头的数目
        2. 出度:此顶点发出的带箭头的线的数目
    1. 完全图
      1. 无向图:每对顶点之间都有一条边相连
      2. 有向图:每对顶点之间的两个顶点,都有另一个顶点的入度线和出度线对应
    1. 路径
      1. 回路:起点和终点是一个点
        1. 简单回路:除了起点和终点之外,中间再没有相同的点,整个路径上除了起点和终点之外,没有重复点。
    1. 连通图和连通分量
    1. 图的存储
      1. 邻接矩阵
        1. 无向图的邻接矩阵是中心对称的
        2. 有向图中的邻街矩阵是非对称的
      1. 图的邻接链表
    1. 图的遍历
      1. 从图中的某一个顶点出发,访问图中的每一个结点,只能访问一次,称为图的遍历
      2. 深度优先:每遍历一个节点,都必须先遍历完与此节点相邻的其它结点,然后再遍历与之同层次的结点。
      3. 广度优先:遍历一点之后,然后依次遍历与此点相邻的结点,遍历完成之后,再依次遍历相邻结点的子节点,遍历完一个节点
    1. 图的最小生成树
      1. 普里姆算法:将图中的点划分为两个集合,最初划分出去的集合A由一个点组成,然后选取另一个集合B中与A集合中唯一点最近的的点,将其从集合B划分到集合A中,接着选取B中的与A中点最近的一个。将此点划分到A中,以此类推。
      2. 克鲁斯卡尔算法:依次选取最小的边,直到所有的顶点都连接到了一起(任意两点都能通过一个点或两个点间接相连)使图产生环路的边,绝对不能取

选取n-1边为止,选取n条边必定有回路,就形不成最小生成树了

  1. 关键路径:顶点为事件,线上为活动,
    1. 顶点j事件的最早发生时间:因为在有向图中,需要将所有入度指向事件j的事件都执行完。才能执行到事件j,不然的话,是没有执行条件的。
    1. 活动ai的最早开始时间:出度的点事件的最早发生时间,就是出度线最早的开始时间。
    1. 顶点的事件最早发生时间也就是出度活动的最早发生时间
    2. 定点j事件的最迟发生时间就是出度活动的最晚发生时间
    1. 活动ai最迟的发生时间,入度点事件的最迟发生时间-活动所需要的时间
    2. 顶点事件j的最迟发生时间,终点事件最早发生的时间max,中间如有那条路径到达终点事件x小于max,则这条路径上的事件最迟发生时间小于顶点事件的最早发生时间,最迟发生时间一般为,入度事件的最迟发生事件 减去 活动的时长。
  1. 排序算法
    1. 插入排序
      1. 直接插入排序:以第一个数值为有序序列,然后将后边的数据按从小到大的序列插入其中
      1. 希尔排序:
    1. 选择排序:不断选择最小的或最大的放到最前边,然后在剩余数组中继续选择最小的或最大的。
    1. 堆:顶点的值小于叶子结点的值(小顶堆),或者顶点的值大于叶子结点的值(大顶堆)
      1. 数组堆排序的建立
        1. 完全二叉树
        2. 调整n/2号结点
        3. 调整n/2-1号结点
        4. 调整父结点,调整完父结点之后,可能会影响子树的的堆排序,这时,就需要从新调整子树的堆排序。
        5. 使得父结点的值变为最大
        6. 父结点和最后一个子节点对调,将父结点排除出去,即得到最大值。
        7. 如此类推
    1. 交换排序
      1. 冒泡排序:相邻两个元素进行比较,若不满足排序规则,则进行交换,每次都能求出最小的或者最大的一个数值。
      2. 快速排序
        1. 方法一:
          1. 以第一个数为Key,指向key的指针为指针key,与最后一个进行比较如果不满足排序规则,则进行交换,交换后,指向指向key的指针不便,指向另一个数的指针前移或后移一位,继续与key,进行比较,如果不满足交换规则,则进行交换,直到与57相邻的数值也进行了比较,并排序
          2. key值左右两边的数组,继续进行二分排序
        1. 方法二:
          1. 两个指针,一个指针从前往后移动,寻找比key大的值,另一个指针从后向前移动,寻找比key小的值,两个指针一旦同时找到符合条件的数值,则进行交换
      1. 归并排序
        1. 就是分组,进行排序,然后将小组排序后形成大组,直到最后所有的数值都到了最大的数组中。
      1. 基数排序:在收集十位的时候,在确保十位是按从小到大排列的同时,在收集个位的时候,已经确保了个位是从小到大排列的,在收集百位的时候,确保了百位是按从小到大排列的。所以最终三者都是按从小到大排列的。满足条件。
  1. Hash表:又可称为哈希表,散列表,或是杂凑表。是一种十分实用的查找技术,具有极高的查找效率。根据内容得到存储地址,用到哈希函数来存储。
    1. Hash函数的构造方法:哈希函数为一组关键字产生的冲突越少,哈希函数越好。没有特定的要求
      1. 直接定址法:以键值对的方法定位,键值是不重复的,所以可以采用直接定址法。最理想的状态。选择条件:键值对选择直接定址法。
      2. 除余法:
      3. 基数转换法:将关键码看作是某个基数上的整数,然后将其转换成为另一基数制上的数。
  1. 查找算法
    1. 顺序查找
    2. 二分查找:要求的待查找序列为有序表。多次寻找查找序列的中间值
    3. 分块查找:将查找表分为多块,前面的块和后面的块有大小顺序,然后将每一块的最大关键字和每一块的起始存储位置取出,存放在索引表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值