大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,该课属于付费课程(不过盗版网盘资源也不难找。。。)。后续又根据23年考研的大纲对内容做了一些调整,将二叉排序树和平衡二叉树的内容挪到了查找一章,并增加了并查集、平衡二叉树的删除、红黑树的内容。

排序一章的各种算法动态过程比较难以展现,所以阅读体验可能不是特别好。

西电的校内考试分机试和笔试。笔试占50分,机试2小时4道题占30分,做出2道满分,多做一道总分加5分。机试尽量把老师平时发的OJ题目都过一遍。笔试内容偏基础,但考的量比较大。

其他各章节的链接如下:

数据结构笔记(王道考研) 第一章:绪论

数据结构笔记(王道考研) 第二章:线性表

数据结构笔记(王道考研) 第三章:栈和队列

数据结构笔记(王道考研) 第四章:串

数据结构笔记(王道考研) 第五章:树和二叉树

数据结构笔记(王道考研) 第六章:图

数据结构笔记(王道考研) 第七章:查找

数据结构笔记(王道考研) 第八章:排序

其他各科笔记汇总

绪论

数据结构学习如何用程序代码把现实世界的问题信息化,学习如何用计算机高效地处理这些信息从而创造价值

数据结构的基本概念

数据

数据是信息的载体,是描述客观事物属性的数,字符及所有能输入计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。

数据元素,数据项

数据元素是数据的基本单位,通常作为一个整体进行考虑和处理

一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。多个数据项可组成组合项

要根据实际的业务需求来确定什么是数据元素,什么是数据项。

数据结构,数据对象

数据结构是相互之间存在一种或多种特定关系的数据元素的集合

数据对象是具有相同性质的数据元素的集合,是数据的一个子集

数据结构的三要素

数据的逻辑结构

数据元素之间的逻辑关系是什么?

集合:各个元素同属一个集合,别无其他关系

线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继

树形结构:数据元素之间是一对多的关系

图结构:数据元素之间是多对多的关系

数据的物理结构(存储结构)

探讨如何用计算机表示数据元素的逻辑关系?

以线性结构这种逻辑结构为例。存储结构可分为顺序存储,链式存储,索引存储,散列存储,后三种为非顺序存储

顺序存储:把逻辑上相邻的元素存储在物理上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系,用指针表示下一个数据元素的存储地址

索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)

散列存储:根据元素的关键字直接计算出元素的存储地址,又称哈希存储(在第六章的散列表学习)

以上内容,现在只需要理解以下几点即可

  • 若采用顺序存储,则各个数据元素在物理上必须是连续的;若采用非顺序存储,则各个数据元素在物理上可以是离散的
  • 数据的存储结构会影响存储空间分配的方便程度
  • 数据的存储结构会影响对数据运算的速度

数据的运算

施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

数据类型,抽象数据类型

数据类型是一个值的集合和定义在此集合上的一组操作的总称,又可分为

1.原子类型。其值不可再分的数据类型

2.结构类型。其值可以再分解为若干成分(分量)的数据类型

抽象数据类型(ADT)是抽象数据组织及与之相关的操作。ADT用数学化的语言定义数据的逻辑结构,定义运算。与具体的实现无关。

定义一个ADT,就是定义了数据的逻辑结构,数据的运算。也就是定义了一个数据结构。而确定一种存储结构,就意味着在计算机中表示出数据的逻辑结构。存储结构不同,也会导致运算的具体实现不同。确定了存储结构,才能实现数据结构。

在探讨一种数据结构时:

1.定义逻辑结构(数据元素之间的关系)

2.定义数据的运算(针对现实需求,应该对这种逻辑结构进行什么样的运算)

3.确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算

算法的基本概念

什么是算法?

程序=数据结构+算法,数据结构研究如何把现实世界的问题信息化,将信息存进计算机。同时还要实现对数据结构的基本操作。算法研究如何处理这些信息,解决实际问题

算法的五个特性

  • 有穷性。一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成
  • 确定性。算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
  • 可行性。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
  • 输入。一个算法有0个或多个输入,这些输入取自于某个特定的对象的集合
  • 输出。一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量

算法必须是有穷的,要求用有限的步骤解决某个特定的问题。而程序可以是无穷的

“好”算法的特性

  • 正确性。算法应能够正确地解决求解问题
  • 可读性。算法应具有良好的可读性,以帮助人们理解
  • 健壮性。输入非法数据时,算法能适当地做出反应或进行处理,而不会莫名其妙的输出结果
  • 高效率(执行速度快,时间复杂度低)与低存储量需求(不费内存,空间复杂度低)

算法可以用伪代码描述,甚至用文字描述,重要的是要“无歧义”地描述出解决问题的步骤

算法的时间复杂度

如何评估算法时间开销?

让算法先运行,事后统计运行时间的方法是不科学的。因为存在如下问题

  • 和机器性能有关,如超级计算机和单片机
  • 和编程语言有关,越高级的语言执行效率越低
  • 和编译程序产生的机器指令质量有关
  • 有些算法是不能事后再统计的,如:导弹发射算法

我们希望评估算法时能排除与算法本身无关的外界因素,且能事先估计,所以有了时间复杂度,以事前预估算法时间开销T(n)T(n)T(n)与问题规模nnn的关系

时间复杂度的计算

  • 时间复杂度的计算满足乘法规则和加法规则

加法规则:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))T(n)=T_1(n)+T_2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))T(n)=T1​(n)+T2​(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))

多项相加,只保留最高阶的项且系数变为1

乘法规则:T(n)=T1(n)+T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))T(n)=T_1(n)+T_2(n)=O(f(n))\times O(g(n))=O(f(n)\times g(n))T(n)=T1​(n)+T2​(n)=O(f(n))×O(g(n))=O(f(n)×g(n))

多项相乘,都保留

  • 表达式只保留阶数高的部分,如T(n)=n3+n2+9999999T(n)=n^3+n^2+9999999T(n)=n3+n2+9999999的各项只保留n3n^3n3

  • 只关心数量级,用大OOO表示“同阶”,同等数量级。即:当n→∞n\to\inftyn→∞时,二者之比为常数

所以常数项系数可以省略,同时时间复杂度的计算结果用O(...)O(...)O(...)的方式表示

  • O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)O(1)<O(log2​n)<O(n)<O(nlog2​n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

可以结合洛必达法则和函数图像来证明,用“常对幂指阶”来记忆

  • 顺序执行的代码只会影响最终结果的表达式的常数项,可以忽略。

  • 考虑循环语句时,只需挑循环中的一个基本操作分析它的执行次数与nnn的关系即可

  • 如果有多层嵌套循环,只需关注最深层循环的循环次数与nnn的关系

  • 很多算法执行时间与输入的数据有关。这种时候就要考虑最好时间复杂度和最坏时间复杂度,平均时间复杂度

最坏时间复杂度:最坏情况下算法的时间复杂度

平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间

最好时间复杂度:最好情况下算法的时间复杂度

算法的空间复杂度

空间复杂度的计算

基本上可以类比时间复杂度的计算

现在要运行一个程序,程序运行前会先把程序代码(这里的代码是源代码编译后生成的机器指令)放到内存中(大小固定,与问题规模无关)。接下来CPU会一行行的执行这些代码,内存中开辟空间存放局部变量和参数,数组和其他信息。

  • 如果无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,算法空间复杂度为S(n)=O(1)S(n)=O(1)S(n)=O(1)。此时可以说算法原地工作。
  • 只需关注存储空间大小与问题规模相关的变量。表达式中的常数项可省略
  • 由于只关心数量级,计算时没必要考虑不同类型变量所占用的内存空间大小上的差异
  • 同样遵循加法和乘法原则,上一节用于比较数量级的不等式也适用于空间复杂度的计算

函数递归调用带来的内存开销

递归过程中每加深一层的调用都需要把这一层的局部变量,参数等在内存中开辟一块新的空间用于存储

  • 只需关注存储空间大小与问题规模相关的变量。表达式中的常数项可省略
  • 由于只关心数量级,计算时没必要考虑不同类型变量所占用的内存空间大小上的差异
  • 同样遵循加法和乘法原则,上一节用于比较数量级的不等式也适用于空间复杂度的计算

函数递归调用带来的内存开销

递归过程中每加深一层的调用都需要把这一层的局部变量,参数等在内存中开辟一块新的空间用于存储

  • 绝大多数情况下空间复杂度=递归调用的深度,有些情况则要具体分析。

数据结构笔记(王道考研) 第一章:绪论相关推荐

  1. 《数据结构》 李春葆 第一章-绪论

    <数据结构> 李春葆 第一章-绪论 1 什么是数据结构 1.1 数据结构的定义 1.2 逻辑结构 1.2.1 逻辑结构的表示 1 什么是数据结构 数据元素以及数据元素之间的关系,数据元素= ...

  2. 数据结构与算法 --- 第一章 绪论

    数据结构与算法 第一章 绪论 1. 作者的话 2. 为什么要学习数据结构与算法 3. 数据结构与算法的作用 4. 数据结构的概念 4.1 名词解读 4.2 什么是数据 4.3 数据结构 4.4 逻辑结 ...

  3. 数字图像识别笔记(第一章绪论)

    title: 数字图像识别笔记(第一章绪论) categories: 数字图像识别 tags: 数字图像识别 date: 2020/9/29 23:59 mathjax: true toc: true ...

  4. 【食品化学与营养】第一章 绪论 笔记

    [食品化学与营养]第一章 绪论 笔记 1.1 食品化学的定义 食品化学的定义 什么是食品 什么是化学 什么是食品化学 食品化学的发展历史 食品化学的研究方法 1.2 食品化学的研究 食品化学 食品化学 ...

  5. 小吴的《机器学习 周志华》学习笔记 第一章 绪论

    小吴的<机器学习 周志华>学习笔记 第一章 绪论 近一年时间接触到不少机器学习的知识,虽然断断续续学了一些,总感觉还没有入门(只学会了疯狂调包).因此,最近开始系统学习Machine Le ...

  6. 软件工程第一章绪论————(2019.12.27学习笔记)

    第一章绪论 第一节软件工程概念的提出与发展 1. 软件危机 1968年,北大西洋公约组织(NATO)在联邦德国的国际学术会议创造软件危机(Software crisis)一词.用来描述因为软件生产率, ...

  7. 传感器检测技术及仪表笔记01第一章 绪论

    第一章 绪论 1.1 检测技术及仪表的地位与作用 1.1.1 检测仪表的地位与作用 1.检测的定义 2.检测仪表的地位与作用 3.检测方法 1.2 传感器概述 1.2.1 传感器的基本概念 1.传感器 ...

  8. 西瓜书读书笔记整理(二)—— 第一章 绪论

    第一章 绪论 第一章 绪论 1.1 引言 1. 什么是机器学习 2. 机器学习的主要内容 3. 模型与模式 1.2 基本术语 1. 数据集 / 训练集 / 验证集 / 测试集 2. 示例 / 样本 3 ...

  9. 数据库 第一章 绪论

    1 数据库系统概述 1.1 数据库的4个基本概念 1.数据(Data) 数据(Data)是数据库中存储的基本对象 数据的定义 描述事物的符号记录 2.数据库(Database) 数据库的定义 数据库( ...

  10. 机器学习-周志华-学习记录-第一章绪论

    文章目录 绪论 一.什么是机器学习 二.基本术语 三.假设空间 四.归纳偏好 总结 参考链接 绪论 为了更早地适应研究生的生活,我决定重新学习周志华老师的机器学习这本书.同时也为了能够养成博客记录的习 ...

最新文章

  1. java contions_Java数据结构与算法
  2. 剑指offer:栈的压入、弹出序列
  3. Selenium无法点击元素,报错:ElementClickInterceptedException:element click intercepted
  4. 丽水数据可视化设计价格_50个数据可视化最有价值的图表(建议收藏)
  5. http 路径 |_HTTP 请求與响应的格式及 curl 命令使用
  6. “Hello,Github!——如何配置并上传一个已有项目到Git上
  7. 为了在简历上写掌握【Java多线程和并发编程】,做了两万字总结
  8. leetcode 1154 一年中的第几天
  9. 最新最全linux系统调优指南(centos7.X)
  10. 28335之GPIO输入
  11. 微博、QQ、微信第三方登录 Java 实现实录
  12. Linux怎么将输入法添加,在Linux系统中给fcitx下的输入法添加自定义词库的方法
  13. 那些让我印象深刻的bug--03
  14. Unity 计算屏幕视口UV坐标的几种方法
  15. shell 命令下载软件 安装软件
  16. MySQL导入Excel表格
  17. python经典书记必读:Python编程快速上手 让繁琐工作自动化
  18. 【Hack The Box】windows练习-- Silo
  19. 小厂B端产品啥都干——B端表格设计入门指南(中)
  20. 迅为国产开发板值得入手的三款开发板

热门文章

  1. PAT 乙级 1010 C语言
  2. 第四届中国软件开源创新大赛“代码评注赛”季度评审结果出炉
  3. 利用qt打开一张图片并转成灰度矩阵
  4. Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications
  5. 指数平滑法,二次指数平滑法(Holt’s linear trend method),季节性预测算法(Holt-Winters’ seasonal method)
  6. Action与ActionListener的事件处理机制及实例分析
  7. 魔方的征途 - 魔方如何选择?
  8. 华为云WeLink数字化人才高研班在杭州开班
  9. Laravel学生信息查询界面
  10. 酷睿i7和i5对计算机专业要求,i5和i7有什么区别?电脑CPU i7和i5的区别分享