数据结构(郝斌课程内容概述)
郝斌老师课程内容模板
- 数据结构概述
- 预备知识
- 模块一:线性结构【把所有的结点用一根直线穿起来】
- 模块二:非线性结构
- 模块三:查找和排序
- 内容回顾与总结
数据结构概述
定义
我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法
数据结构 = 个体的存储 + 个体的关系存储
算法 = 对存储数据的操作
算法
- 解题的方法和步骤
- 衡量算法的标准
- 时间复杂度:大概程序要执行的次数,而非执行的时间
- 空间复杂度:算法执行过程中大概所占的最大内存
- 难易程度
- 健壮性
数据结构的地位
- 数据结构是软件中最核心的课程
程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言
预备知识
指针
指针的重要性:
- 指针是c语言的灵魂
定义
地址
内存单元的编号从0开始的非负整数
范围:0–FFFFFFF【4G-1】
指针:
指针就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
分类:
- 基本类型指针
- 指针和数组的关系
结构体/类
为什么会出现结构体
- 为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
什么叫结构体
- 结构体是用户根据实际需要自己定义的复合数据类型
如何使用结构体
两种方式:
struct Student st = {1000, "张三", 20} struct Student * pst = &st;1.st.sid 2.pst->sid pst所指向的结构体变量中的sid这个成员
注意实现
- 结构体变量不能加减乘除,但可以相互赋值
- 普通结构体变量和结构体指针变量作为函数传参的问题
动态内存的分配和释放
逻辑结构:(大脑中存储数据的一种方式,与计算机无关)
线性
数组
链表
栈和队列是一种特殊的线性结构
非线性
- 树
- 图
物理结构(把逻辑的关系保存在计算机中)
模块一:线性结构【把所有的结点用一根直线穿起来】
连续存储[数组]
什么叫数组
元素类型相同,大小相同
数组的优缺点
优点:
- 存取速度很快
缺点:
- 实现必须知道数组的长度
- 需要大块连续的内存块
- 插入删除元素的效率很低
确定一个数组需要几个参数
首地址,长度,有效个数
离散存储[链表]
定义:
n个节点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后驱节点
首节点没有前驱节点,尾节点没有后续节点
专业术语:
- 首节点:第一个有效节点
- 尾节点:最后一个有效节点
- 头结点:
- 头结点的数据类型和首节点的数据类型相同
- 第一个有效节点之前的那个节点
- 头节点并不存放有效数据
- 加头节点的目的主要是为了方便对链表的操作
- 头指针:指向头结点的指针变量
- 尾指针:指向尾节点的指针变量
如果希望通过一个函数对链表进行处理,我们至少需要接受链表的那些参数:
- 只需要一个参数:头指针
- 因为我们通过头指针可以推算出链表的其它所有信息
分类:
单链表
双链表:每一个节点有量个指针域
循环链表:能通过任何一个节点找到其它所有的节点
非循环链表
算法:
- 遍历
- 查找
- 清空
- 销毁
- 求长度
- 排序
- 删除节点
- 插入节点
算法:
- 狭义的算法是与数据的存储方式密切相关
- 广义的算法是与数据的存储方式无关
- 泛型:
- 利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的。
- 实现方式:
- 模板
- 运算符的重载
- 指针
优缺点
优点:
- 空间没有限制
- 插入删除元素很快
缺点:
- 存取速度很慢
线性结构的两种常见应用之一 栈
定义:
- 一种可以实现“先进后出”的存储结构
- 栈类似于箱子
分类
静态栈
动态栈
算法
- 出栈
- 压栈
应用
- 函数调用
- 中断
- 表达式求值
- 内存分配
- 缓冲处理
- 迷宫
线性结构的两种常见应用之一 队列
定义:
- 一种可以实现“先进先出”的存储结构
分类
链式队列:用链表实现
静态队列:用数组实现(通常必须是循环队列)
循环队列的讲解:
静态队列为什么必须是循环队列
循环队列需要几个参数来确定
需要2个参数来确定
循环队列各个参数的含义
2个参数不同场合有不同的含义及其含义的讲解
1). 队列初始化
front和rear的值都是零
2).队列非空
front代表的是队列的第一个元素
rear代表的是队列的最后一个有效元素的下一个元素
3).队列空
front和rear值相等,但不一定是零
循环队列入队伪算法讲解
两步完成:
将值存入r所代表的位置
r=(r+1)%数组的长度r=(r+1)\%数组的长度r=(r+1)%数组的长度
循环队列出队伪算法讲解
f=(f+1)%数组的长度f=(f+1)\%数组的长度f=(f+1)%数组的长度
如何判断循环队列是否为空
如果front和rear值相等,则该队列就一定为空
如何判断循环队列是否已满
预备知识:
- front的值可能比rear打
- front的值也可能比rear小
- 也可能相等
两种方式:
多增加一个标识参数
少用一个元素【通常使用第二种方式】
如果f和r的值挨着,则队列已满,
if((r+1)%数组长度==f) 已满 else 不满
队列算法
- 入队
- 出队
队列的具体应用:
- 所有和时间有关的操作都有队列有关的影子
专题:递归
定义:
一个函数自己或间接调用自己
递归满足三个条件
- 递归必须得有一个明确的终止条件
- 该函数所处理的数据规模必须在递减
- 在这个转化必须是可解的
循环和递归
递归:
- 易于理解
- 速度慢
- 存储空间大
循环:
- 不易理解
- 速度快
- 存储空间小
举例:
- 1+2+。。。+100的和
- 求阶乘
- 汉诺塔
- 走迷宫
递归的应用
- 树和森林就是以递归的方式定义的
- 数和图的很多算法都是以递归来实现的
- 很多数学公式就是以递归的方式定义的(斐波拉契序列)
函数的调用
当在一个函数的运行期间调用另一个函数时,在运行被掉函数之前,系统需要完成三件事:
- 将所有的实际参数,返回地址等信息传递给被调函数保存
- 为被调函数的局部变量(也包括形参)分配存储空间
- 将控制转移到被调函数的入口
从被调函数返回主调函数之前,系统也要完成三件事:
- 保存被调函数的返回结果
- 释放被调函数所占的存储空间
- 依照被调函数保存的返回地址将控制转移到调用函数
当有多个函数相互调用时,按照“后调用先返回”的原则,上述函数之间信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,执行出栈操作,当前运行的函数永远都在栈顶位置。
A函数函数调用A函数和A函数调用B函数在计算机看来是没有任何区别的,只不过用我们日常的思维方式理解比较怪异而已!
模块二:非线性结构
树
定义:
专业定义
- 有且只有一个称为根的节点
- 有若干个互不相交的子树,这些子树本身也是一棵树
通俗的定义:
- 树是由节点和边组成
- 每个节点只有一个父节点但可以有多个子节点
- 但有一个节点例外,该节点没有父节点,此节点称为根节点
专业术语
- 节点
- 父节点
- 子节点
- 子孙
- 堂兄弟
- 深度:从根节点到最底层节点的层数称之为深度(根节点是第一层)
- 叶子节点:没有子节点的节点
- 非终端节点:实际就是非叶子节点
- 根节点可以是叶子节点,也可以是非叶子节点
- 度(横向):子节点的个数称为 度
分类:
- 一般树:任意一个节点的子节点的个数都不受限制
- 二叉树(有序):任意一个节点的子节点个数最多两个,且子节点的位置不可更改
- 分类:
- 一般二叉树
- 满二叉树:在不添加树层数的前提下,无法再添加一个节点的二叉树就是满二叉树
- 完全二叉树:如果只是删除了满二叉树最底层最右边的连续若干节点,这样形成的二叉树就是完全二叉树
- 分类:
- 森林:n个互不相交的树的集合
存储:
- 二叉树的存储
- 连续存储【完全二叉树】
- 优点:查找某个节点的父节点和子节点速度很快(也包括判断有没有子节点)
- 缺点:耗用内存空间很大
- 链式存储
- 连续存储【完全二叉树】
- 一般树的存储
- 双亲表示法(求父节点方便)
- 孩子表示法(求子节点方便)
- 双亲孩子表示法(求父节点和子节点都很方便)
- 二叉树表示法
- 把一个普通树转化成二叉树来存储
- 具体转换方法:设法保证任意一个节点左指针域指向它的第一个孩子,右指针域指向它的兄弟,只要能满足此条件,就可以把一个普通树转化为二叉树
- 一个普通树转化成的二叉树一定没有右子树
- 二叉树的存储
操作:
遍历
- 先序遍历【先访问根节点】
- 先访问根节点
- 再先序访问左子树
- 再先序访问右子树
- 中序遍历【中间访问根节点】
- 中序遍历左子树
- 再访问根节点
- 再中序遍历右子树
- 后续遍历【最后访问根节点】
- 中序遍历左子树
- 中序遍历右子树
- 再访问根节点
- 先序遍历【先访问根节点】
已知两种遍历序列求原始二叉树
通过先序和中序 或者 中序和或许我们可以还原出原始的二叉树
但是通过先序和后序是无法还原出原始的二叉树的
换一种说法:只有通过先序和中序 或者 中序和后序我们才可以唯一的确定一个二叉树
列子
先序:ABCDEFGH
中序:BDCEFAFHG
求后序:DEFCBHGFA
先序:ABDGHCEFI
中序:GDHBAECIF
求后序:GHDEIFCA
应用
- 树是数据库中数据组织一种重要形式
- 操作系统子父进程的关系本身就是一棵树
- 面向对象语言中类的继承关系
- 赫夫曼树
图
模块三:查找和排序
折半查找
排序:
- 冒泡
- 插入
- 选择
- 快速排序
- 归并排序
排序内容请参考博客
十大经典排序算法的理解、动图演示和Python方法实现_frighting_ing的博客-CSDN博客
内容回顾与总结
再次讨论什么是数据结构
- 数据结构研究是数据的存储和数据的操作的一门学问
- 数据的存储分为两部分:
- 个体的存储
- 个体关系的存储
- 从某个角度而言,数据的存储最核心的就是个体关系的存储,个体的存储可以忽略不记
再次讨论到底什么是泛型
- 同一种逻辑结构,无论该逻辑结构物理存储是什么样子的,我们可以对它执行相同的操作
数据结构(郝斌课程内容概述)相关推荐
- 【数据结构(郝斌)】03线性结构-栈
数据结构-栈 什么是栈 静态栈 动态栈 区别: 静态栈 动态栈 操作 栈的标准库操作 动态栈的操作实现 操作 void initStack(PSTACK s) void pushStack(PSTAC ...
- 郝斌数据结构全套教程高清在线观看和下载-学习数据结构必看
郝斌数据结构全套共78集 郝斌数据高清在线观看 https://www.bilibili.com/video/av49304765/ 郝斌数据高清在线观看 https://www.bilibili.c ...
- Java入门学习笔记——郝斌(一)概述及面向对象
Java入门学习笔记--郝斌 1.Java概述 java的起源和发展 java的特点 java的应用领域 java学习目标 环境变量的设置 为什么要设置path? path的设置 有关classpat ...
- 郝斌数据结构教程 送给数据结构新手的福利
下面的链接是郝斌数据结构教学视频下载地址: *无论在校大学生还是工作人员,数据结构是算法的奠基石,打好基础,至关重要. 各位在学习之余有空看看该教程会有很大的帮助,希望大家喜欢,多多支持. http: ...
- 郝斌数据结构——链表
郝斌数据结构 -- 链表 文章目录 1. 定义 2. 专业术语: 3. 注意事项 4. 代码 1. 定义 定义:n 个节点离散分配:彼此通过指针相连:每个节点只有一个后续节点,首节点没有前驱 节点,尾 ...
- C语言郝斌视频学习一 变量为什么要初始化和一个小例子以及大纲笔记
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以"85"开头的很大的数字(此时该段内存中为一个垃圾 ...
- 郝斌老师C语言学习笔记(一)
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以"85"开头的很大的数字(此时该段内存中为一个垃圾 ...
- 郝斌c语言大纲百度云,C语言学习大纲 郝斌(讲解)
教你如何快速掌握C语言,郝斌讲解,幽默而且加深了解.... 语言概述: 1.为什么学习C语言 1). C的起源和发展 2).C的特点 优点 代码量小 速度快 功能强大 缺点 危险性高 开发周期长 可移 ...
- 郝斌老师-C语言视频教程(全180讲)
<郝斌C语言自学教程>郝斌老师C语言自学专讲180集完整版 目录: 180_C期末考试测试题讲解 下 179_NULL的含义 178_C期末考试测试题讲解上 177_文件 宏 typede ...
- 计算机课做ppt的软件有哪些内容,课程内容计算机软件的基础知识.ppt
<课程内容计算机软件的基础知识.ppt>由会员分享,可在线阅读,更多相关<课程内容计算机软件的基础知识.ppt(15页珍藏版)>请在人人文库网上搜索. 1.数据结构,课程内容: ...
最新文章
- 【刷算法】整数中1出现的次数(从1到n整数中1出现的次数)
- 没抢到欧冠杯的票?没关系!在VR中看!
- Redis学习(3)-redis启动
- 什么地方容易刷出ak_男人会用什么理由拒绝表白?
- redis快照文件dump.rdb解析工具--redis-rdb-tools
- mysql的字符型系统数据类型主要包括_MySQL的数据类型主要包括哪些
- Asp.Net Mvc3.0(MEF依赖注入实例)
- IIS7中WCF配置问题集合
- linux逻辑分区最小值,linux 逻辑卷管理 调整分区大小
- linux覆盖文件如何还原_大数据笔试真题集锦---第十九章Linux面试题
- sqlite3 cmd命令输出乱码
- 基于SQL Server策略的管理-更改时评估模式
- [VSCode] Ubuntu 自动添加了 vscode 源
- 全网首发:JProfiler11运行时找不到库的解决办法
- [HDOJ3068]最长回文
- C++实现均值滤波器和中值滤波器
- Linux log工具:zlog编译安装及使用示例(同样适用交叉编译环境)
- 【LeetCode】592. 分数加减运算
- 真假马云Deciphering Jack Ma
- html js 做一个钟表,html,css,js实现的一个钟表
热门文章
- Mbed记录 STM32F207ZG板子引脚图
- 图像频域处理之高斯滤波器
- 【Yolov5】1.认真总结6000字Yolov5保姆级教程(2022.06.28全新版本v6.1)
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之IPD?
- 计算机机试题Excel,2009年职称计算机考试_Excel机试题-1
- Word:转换PDF
- c++ vector随机排序
- lunix remount u盘_使用e2fsck修复损坏的Linux磁盘|Read only|LVM|EXT4-FS
- 内外网隔离 双网隔离DoraOS云终端双桌面云办公应用
- 尚硅谷 模拟w3school首页导航条练习