- 数据结构
- 1.数据结构基础知识
- 1.1 什么是数据结构
- 数据结构就是数据的逻辑结构以及存储操作(数据的运算) 数据结构没有想象的那么复杂,它就教会你一件事:如何更有效的存储数据
- 1.2 数据
- 数据:不再是单纯的数字了,而是类似于集合的概念。
- 数据元素:是数据的基本单位,由若干个数据项组成。
- 数据项:数据的最小单位,描述数据元素的有用信息。
- 数据元素又叫节点
- 例如:
- 数据:图书
- 数据元素:每一行也就是每本书
- 数据项:编号、书名、作者、出版社等
- 1.3 逻辑结构
- (1).线性关系
- 线性结构 ==> 一对一 ==>线性表:顺序表、链表、栈、队列
- (2).层次关系
- 树形结构 ==> 一对多 ==> 树:二叉树
- (3).网状关系
- 图状结构 ==> 多对多 ==> 图
- (1).线性关系
- 1.4 存储结构
- 数据的逻辑结构在计算机中的具体实现(数据的运算)
- 1.4.1 顺序存储
- 数组:连续存储
- 特点:内存连续、随机存取、每个元素占用空间较少
- 1.4.2 链式存储
- 通过指针实现
- 特点:内存不连续,通过指针实现,每个元素占用空间相对较大
-
-
- 1.4.3 索引存储
- 在存数据的同时,建立一个附加的索引表。 也就是索引存储 = 索引表 + 数据文件 可以提高查找速度,特点检索速度快,但是占用内存多,删除数据文件要及时更改索引表。
-
- 1.4.4 散列存储
- 数据存储按照和关键码之间的关系进行存取。关系由自己决定,比如关键码是key, 存储位置也就是关系是key+1。获取关键数据,通过元素的关键码方法的返回值来获取。 存的时候按关系存,取的时候按关系取。
- 1.4.1 顺序存储
- 数据的逻辑结构在计算机中的具体实现(数据的运算)
- 1.5 操作
- 增删改查
- 1.1 什么是数据结构
- 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)
- 2.1 什么是算法
- 3.线性表
- 3.1什么是线性表
- 线性表是最基本、最简单、也是最常用的一种数据结构,可以存储逻辑关系为线性的数据。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
- 包含:顺序表(数组)、链表(单向链表、单向循环链表、双向链表、双向循环链表)、栈(顺序栈、链式栈)、队列(循环队列、链式队列)
- 逻辑结构:线性结构
- 存储结构:可以是顺序(数组)或链式存储(通过指针)
- 3.2顺序表
- 3.2.1概念
- 顺序表存储数据的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。
- 3.2.2特性
- 逻辑结构:线性结构
- 存储结构:顺序存储
- 特点:内存连续,可以用数组实现,大小固定
- 操作: 增删改查
- 3.2.3数组操作
- (1)普通操作
-
- (2)添加全局遍历last表示最后一个有效元素下标
-
- (3)顺序表编程实现
-
- (1)普通操作
- 3.2.1概念
- 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.3.1什么是链表
- 3.4顺序表和单向链表比较
- (1)顺序表在内存当中连续存储的,通过数组实现;但是链表在内存当中是不连续存储的,通过指针将数据链接在一起。
- (2)顺序表的长度是固定的;链表长度不固定。
- (3)顺序表查找和修改可以根据下标找到对应元素效率对比链表高,但是插入和删除涉及到元素移动效率低;链表,插入和删除方便,查和改效率低。
- 3.1什么是线性表
- 4.栈 Stack
- 4.1 什么是栈
- 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。
- 特点:栈是先进后出FILO(First In Last Out)、( LIFO(Last In First Out))
- 4.2 顺序栈
- 4.2.1 特性
- 逻辑结构:线性结构
- 存储结构:顺序存储
- 操作:创建、入栈、出栈、清空、判空和判满
-
- 创空
-
- 入栈
-
- 出栈
-
- 创空
- 4.2.2 代码实现
-
- 4.2.1 特性
- 4.3 链式栈
- 4.3.1 特性
- 逻辑结构:线性结构
- 存储结构:链式存储
- 顺序栈和链式栈的区别:存储结构不同,实现的方式也不同,顺序栈是用顺序表实现的而链式栈用链表实现。
- 操作:创建、入栈、出栈、判空
- 4.3.2 代码实现
- 入栈
-
- 出栈
-
-
- 入栈
- 4.3.1 特性
- 4.1 什么是栈
- 5.队列 Queue
- 5.1 特性
- 队列是只允许再两端进行插入和删除操作的线性表,在队尾插入,在队头删除,插入的一段被称为“队尾”,删除的一端被称为“队头”。队列包括循环队列(顺序队列)、链式队列。
- 结构:先进先出: FIFO
- 操作: 创建、入队、出队、判空或判满
-
-
- 5.2 循环队列
- 5.2.1 特性
- 逻辑结构: 线性结构
- 存储结构:顺序存储
- 操作:创建、入列、出列、判空和判满
- 5.2.2 代码实现
- 创空
-
- 入列
-
- 出队
-
- 求长度
-
-
- 循环队列,如果数组的元素个数为N,那么队列中最多能够存储的数据数的多少?N-1个 为什么?
- 答:rear 后面 队尾,在插入的时候,插入之前需要先判断 rear+1,也就是他的下一个为位置是否 等于 front 来判断队列是否为满,会造成浪费一个存储位置。
- 创空
- 5.2.1 特性
- 5.3 链式队列
- 5.3.1 特性
- 逻辑结构: 线性结构
- 存储结构: 链式存储
- 操作:创建、入列、出列、判空
- 5.3.2 代码实现
- 创空
-
- 入队
-
- 出队
-
-
- 创空
- 5.3.1 特性
- 5.1 特性
- 6.双向链表
- 6.1 特性
- 逻辑结构: 线性结构
- 存储结构: 链式存储
- 操作:增删改查
- 6.2 代码实现
- 创空
-
- 插入
-
- 删除
-
- 按数据删除
-
-
- 创空
- 6.1 特性
- 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.1.1 什么是树
- 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)二叉树的遍历(重点)
- 前序:根 --> 左 -->右
- 中序:左 --> 根 -->右
- 后续:左 --> 右 -->根
- (1)二叉树的顺序存储结构
- 7.2.1 什么是二叉树
- 7.3二叉树的链式存储
- 用链表实现,基于完全二叉树规律来构建树,按照完全二叉树的编号方法,从上到下,从左到右。
- 第i个节点:
- 左子节点编号:2*i (2*i<=n代表有左子)
- 右子节点编号: 2*i+1 (2*i+1<=n代表有右子)
- 可以根据左右节点编号来判断是否对二叉树构建完成
-
- 7.1 特性
- 1.数据结构基础知识
数据结构(全)
最新推荐文章于 2025-04-10 18:05:44 发布