数据结构(全)

  • 数据结构
    • 1.数据结构基础知识
      • 1.1 什么是数据结构
        • 数据结构就是数据的逻辑结构以及存储操作(数据的运算) 数据结构没有想象的那么复杂,它就教会你一件事:如何更有效的存储数据
      • 1.2 数据
        • 数据:不再是单纯的数字了,而是类似于集合的概念。
        • 数据元素:是数据的基本单位,由若干个数据项组成。
        • 数据项:数据的最小单位,描述数据元素的有用信息。
        • 数据元素又叫节点
        • 例如:
        • 数据:图书
        • 数据元素:每一行也就是每本书
        • 数据项:编号、书名、作者、出版社等
      • 1.3 逻辑结构
        • (1).线性关系
          • 线性结构 ==> 一对一 ==>线性表:顺序表、链表、栈、队列
        • (2).层次关系
          • 树形结构 ==> 一对多 ==> 树:二叉树
        • (3).网状关系
          • 图状结构 ==> 多对多 ==> 图
      • 1.4 存储结构
        • 数据的逻辑结构在计算机中的具体实现(数据的运算)
          • 1.4.1 顺序存储
            • 数组:连续存储
            • 特点:内存连续、随机存取、每个元素占用空间较少
          • 1.4.2 链式存储
            • 通过指针实现
            • 特点:内存不连续,通过指针实现,每个元素占用空间相对较大
          • 1.4.3 索引存储
            • 在存数据的同时,建立一个附加的索引表。 也就是索引存储 = 索引表 + 数据文件 可以提高查找速度,特点检索速度快,但是占用内存多,删除数据文件要及时更改索引表。
          • 1.4.4 散列存储
            • 数据存储按照和关键码之间的关系进行存取。关系由自己决定,比如关键码是key, 存储位置也就是关系是key+1。获取关键数据,通过元素的关键码方法的返回值来获取。 存的时候按关系存,取的时候按关系取。
      • 1.5 操作
        • 增删改查
    • 2.算法基础知识
      • 2.1 什么是算法
        • 算法就是解决问题的思想方法,数据结构是算法的基础。
        • 数据结构 + 算法 = 程序
      • 2.2 算法的设计
        • 算法的设计: 取决于数据逻辑结构
        • 算法的实现:依赖于数据的存储结构
      • 2.3 算法的特点
        • 有穷性:步骤是有限的
        • 确定性:每一个步骤都有明确的含义,无二义性。
        • 可行性:规定实现可以完成
        • 输入
        • 输出
      • 2.4 评价算法好坏
        • 正确性
        • 易读性
        • 健壮性:容错处理
        • 高效性:执行效率,通过重复执行语句的次数来判断,也就是时间复杂度(通过时间处理函数)来判断。
      • 2.5时间复杂度
        • 语句频度:用时间规模函数表达
        • 时间规模函数: T(n)=O(f(n))
        • T(n) //时间规模的时间函数
        • O //时间数量级
        • n //问题规模,例如:a[100], n=100
        • f(n) //算法可执行重复语句的次数
        • 称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
        • 渐进时间复杂度用大写O来表示,所以也被称为大O表示法。直白的讲,时间复杂度就是把时间规模函数T(n)简化为一个数量级,如n,n^2,n^3。
        • 计算大O的方法:
        • (1)根据问题规模n写出表达式f(n)
        • (2)如果有常数项,将其置为1 //当f(n)的表达式中只有常数项的时候,例如f(n)=8 ==> O(1)
        • (3)只保留最高项,其他项舍去。
        • (4)如果最高项系数不为1,则除以最高项系数。//f(n) = 3*n^4 + 2*n^3 + 6*n^7 +10;==> O(n^7)
    • 3.线性表
      • 3.1什么是线性表
        • 线性表是最基本、最简单、也是最常用的一种数据结构,可以存储逻辑关系为线性的数据。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
        • 包含:顺序表(数组)、链表(单向链表、单向循环链表、双向链表、双向循环链表)、栈(顺序栈、链式栈)、队列(循环队列、链式队列)
        • 逻辑结构:线性结构
        • 存储结构:可以是顺序(数组)或链式存储(通过指针)
      • 3.2顺序表
        • 3.2.1概念
          • 顺序表存储数据的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。
        • 3.2.2特性
          • 逻辑结构:线性结构
          • 存储结构:顺序存储
          • 特点:内存连续,可以用数组实现,大小固定
          • 操作: 增删改查
        • 3.2.3数组操作
          • (1)普通操作
          • (2)添加全局遍历last表示最后一个有效元素下标
          • (3)顺序表编程实现
      • 3.3链表Link
        • 3.3.1什么是链表
          • 链表又称单链表、链式存储结构,用于存储逻辑关系为“一对一”的数据。 和顺序表不同同,使用链表存储数据,不强制要求数据在内存中集中存储,各个元素可以分散存储在内存中。所以在链表中,每个数据元素可以配有一个指针用于找到下一个元素即节点,这意味着,链表上的每个“元素”都长下图这个样子:
        • 3.3.2 链表的特性
          • 逻辑结构:线性结构
          • 存储结构:链式存储
          • 特点:内存不连续,通过指针链接,大小不固定。 解决顺序表大小固定以及插入和删除效率低的问题。
          • 操作:增删改查
        • 3.3.3单向链表
          • 有头链表:存在一个头节点,头节点数据无效指针域有效。
          • 无头链表:每一个节点的数据域和指针域都有效。
          • 遍历无头单向链表
          • 遍历有头单向链表
          • 有头链表的函数操作
        • 3.3.4单向循环链表
          • 约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。
      • 3.4顺序表和单向链表比较
        • (1)顺序表在内存当中连续存储的,通过数组实现;但是链表在内存当中是不连续存储的,通过指针将数据链接在一起。
        • (2)顺序表的长度是固定的;链表长度不固定。
        • (3)顺序表查找和修改可以根据下标找到对应元素效率对比链表高,但是插入和删除涉及到元素移动效率低;链表,插入和删除方便,查和改效率低。
    • 4.栈 Stack
      • 4.1 什么是栈
        • 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。
        • 特点:栈是先进后出FILO(First In Last Out)、( LIFO(Last In First Out))
      • 4.2 顺序栈
        • 4.2.1 特性
          • 逻辑结构:线性结构
          • 存储结构:顺序存储
          • 操作:创建、入栈、出栈、清空、判空和判满
            • 创空
            • 入栈
            • 出栈
        • 4.2.2 代码实现
      • 4.3 链式栈
        • 4.3.1 特性
          • 逻辑结构:线性结构
          • 存储结构:链式存储
          • 顺序栈和链式栈的区别:存储结构不同,实现的方式也不同,顺序栈是用顺序表实现的而链式栈用链表实现。
          • 操作:创建、入栈、出栈、判空
        • 4.3.2 代码实现
          • 入栈
          • 出栈
    • 5.队列 Queue
      • 5.1 特性
        • 队列是只允许再两端进行插入和删除操作的线性表,在队尾插入,在队头删除,插入的一段被称为“队尾”,删除的一端被称为“队头”。队列包括循环队列(顺序队列)、链式队列。
        • 结构:先进先出: FIFO
        • 操作: 创建、入队、出队、判空或判满
      • 5.2 循环队列
        • 5.2.1 特性
          • 逻辑结构: 线性结构
          • 存储结构:顺序存储
          • 操作:创建、入列、出列、判空和判满
        • 5.2.2 代码实现
          • 创空
          • 入列
          • 出队
          • 求长度
          • 循环队列,如果数组的元素个数为N,那么队列中最多能够存储的数据数的多少?N-1个 为什么?  
            • 答:rear 后面 队尾,在插入的时候,插入之前需要先判断 rear+1,也就是他的下一个为位置是否 等于 front 来判断队列是否为满,会造成浪费一个存储位置。
      • 5.3 链式队列
        • 5.3.1 特性
          • 逻辑结构: 线性结构
          • 存储结构: 链式存储
          • 操作:创建、入列、出列、判空
        • 5.3.2 代码实现
          • 创空
          • 入队
          • 出队
    • 6.双向链表
      • 6.1 特性
        • 逻辑结构: 线性结构
        • 存储结构: 链式存储
        • 操作:增删改查
      • 6.2 代码实现
        • 创空
        • 插入
        • 删除
        • 按数据删除
    • 7.树 Tree
      • 7.1 特性
        • 7.1.1 什么是树
          • 树(Tree)是(n>=0)个节点的有限集合T,它满足两个条件:
          • (1) 有且仅有一个特定的称为根(Root)的节点。
          • (2)其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。
          • 树的特性:层次关系,一对多,每个节点最多有一个前驱,但是可以有多个后继(根节点无前驱,叶节点无后继)。
          • 关于树的节点:和链表类似,树存储结构中也将存储的各个元素称为 "结点"。
        • 7.1.2 关于树的一些术语
          • 度数:一个节点的子树的个数 (一个节点有几个孩子为该节点度数)   
          • 树度数:树中节点的最大度数
          • 叶节点或终端节点: 度数为零的节点       
          • 分支节点:度数不为零的节点
          • 内部节点:除根节点以外的分支节点 (去掉根和叶子) 节
          • 点层次:  根节点的层次为1,根节点子树的根为第2层,以此类推
          • 树的深度或高度: 树中所有节点层次的最大值
      • 7.2 二叉树
        • 7.2.1 什么是二叉树
          • 二叉树(Binary Tree)是n(n≥0)个节点的有限集合,它或者是空集(n=0), 或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。
          • 二叉树与普通有序树不同,二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。
        • 7.2.2 二叉树性质(重点)
          • (1)二叉树第k(k>=1)层上的节点最多为2的k-1次幂个。//2^(k-1)
          • (2)深度为k(k>=1)的二叉树最多有2的k次幂-1个节点。//满二叉树的时候  最多的节点数 2^k-1
          • (3)在任意一棵二叉树中,树叶的数目比度数为2的节点的数目多一。 设度数为0的节点数为n0,度数为1的节点数为n1以及度数为2的节点数为n2,则: 总节点数为各类节点之和:n = n0 + n1 + n2 总节点数为所有子节点数加一: n = 0*n0 + 1*n1 + 2*n2 +1 = n1 + 2*n2 + 1 上下公式相减得: 0 = -n0 + n2 + 1 ==> n0 = n2 + 1
        • 7.2.3 满二叉树和完全二叉树
          • 满二叉树: 深度为k(k>=1)时节点数为2^k - 1(2的k次幂-1)
          • 完全二叉树: 只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。(先挂树的左边向右, 从上向下挂)
        • 7.2.4哈夫曼树 Huffman
          • 哈夫曼树又称为最优树. 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。
          • 哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
          • 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
          • 2、结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
          • 3、树的带权路径长度 树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。(Weighted Path Length of Tree)
        • 7.2.5 二叉树的存储结构
          • (1)二叉树的顺序存储结构
            • 顺序存储结构 :完全二叉树节点的编号方法是从上到下,从左到右,根节点为1号节点。设完全二叉树的节点数为n,某节点编号为i:
            • ●当i>1(不是根节点)时,有父节点,其父节点编号为i/2;
            • ●当2*i<=n时,有左孩子,其编号为2*i, 否则没有左孩子,本身是叶节点;
            • ●当2*i+1<=n时,有右孩子,其编号为2*i+1 ,否则没有右孩子。
          • (2)二叉树的遍历(重点)
            • 前序:根 --> 左 -->右
            • 中序:左 --> 根 -->右
            • 后续:左 --> 右 -->根
      • 7.3二叉树的链式存储
        • 用链表实现,基于完全二叉树规律来构建树,按照完全二叉树的编号方法,从上到下,从左到右。
        • 第i个节点:
        • 左子节点编号:2*i (2*i<=n代表有左子)
        • 右子节点编号: 2*i+1 (2*i+1<=n代表有右子)
        • 可以根据左右节点编号来判断是否对二叉树构建完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值